Re: Dereferencing and returning by reference!
On 2013-05-15 12:45, Richard Corden wrote:
On 05/14/2013 11:26 PM, Prasoon Saurav wrote:
[...]
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
[...]
At line 1 is it implementation defined/unspecified that the
deference would not happen as we are returning by reference and the
program would not crash if an explicit access to the pointed to
object is not made?
The last line of:
http://std.dkuug.dk/JTC1/SC22/WG21/docs/cwg_active.html#232
Has:
We agreed that the approach in the standard seems okay: p = 0;
*p; is not inherently an error. An lvalue-to-rvalue conversion
would give it undefined behavior.
I believe the intent is that, as return of '*obj' doesn't involve an
'lvalue to rvalue' conversion there is no problem at this point.
I agree that the mentioned issue is related to this problem. The most
recent issue state can be found here:
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232
Note that the current resolution tendency (the issue is still
drafting) seems to indicate that only references to a null object or
to a one past the last element of an array would be feasible, not a
reference to something arbitrary would be supported. In this case, the
example part - even the one that would restrict to the following
variation
struct A
{
virtual void func(){}
A& foo()
{
A *obj = reinterpret_cast<A*>(0xdeadbeef);
return *obj; //1
}
};
int main()
{
A& obj = obj.foo();
}
would still have undefined behaviour, because
"reinterpret_cast<A*>(0xdeadbeef)" would not satisfy any of the
criteria.
HTH & Greetings from Bremen,
- Daniel Kr?gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]