Re: Non-const, L-value temporary
Frederick Gotham wrote:
I disagree, because questions of this nature are so vaguely answered by
the Standard, the it's pertinent to ask them on the Standard's newsgroup.
Actually, the standard seems pretty clear on the matter (although the
clear answer is, in fact, probably going to change in the next
"release" of the standard).
Consider the now-years-old question of whether the following is OK:
#include <string>
using std::string;
string ReturnByValue(); /* Defined elsewhere */
int main()
{
const string &cr = ReturnByValue();
string &r = const_cast<string&>( cr );
r = "I've been manipulated!";
}
Code akin to that above has been posted to comp.lang.c++ several times,
but without receiving any definitive answer... thus I say that when the
Standard is too vague about certain things, it's time to come to
comp.std.c++.
The code above exhibits undefined behavior. 8.5.3/5 indicates that the
compiler is allowed to introduce a temporary of type const string and
bind the reference cr to that object. (The const temporary is
*different from* the non-const temporary returned by the function.)
Modifying a "true" const object results in undefined behavior.
The current working draft of the standard contains an amendment which
would change this for the case where the initializer expression has
class type and is reference-compatible with the type of the reference
(which would apply to the code above):
http://www2.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#391
The originally posted code, in which the initializer is not of class
type:
const_cast<int&>( static_cast<const int&>( int() ) ) = 5;
has undefined behavior under both the current and future rules: the
reference winds up bound to a temporary of "true" const type, and
modifying that object results in undefined behavior.
---
[ comp.std.c++ is moderated. To submit articles, try just posting with ]
[ your news-reader. If that fails, use mailto:std-c++@ncar.ucar.edu ]
[ --- Please see the FAQ before posting. --- ]
[ FAQ: http://www.comeaucomputing.com/csc/faq.html ]