Re: Temporaries, references, lifetimes and const_cast
Paul Thomas posted:
std::string &str = const_cast<std::string &>(cstr);
I first asked this question a few years ago. Just recently I brought it
up again. Here's the thread:
http://groups.google.ie/group/comp.std.c++/browse_frm/thread/c8dd97ce2bb9
4e0b/6edac02c40c8e64e?lnk=st&q=const+group%3Acomp.std.c%2B%2B+author%
3ATom%C3%A1s&rnum=3&hl=en#6edac02c40c8e64e
std::string Func() { return "monkey"; }
std::string& Funky(std::string& str){
return str += " magic";
}
std::string& Munky(const std::string& cstr){
return const_cast<std::string &>(cstr);
}
int main(){
//Funky(Func()); <-- no-no!
std::cout << Funky(Munky(Func())) << std::endl;
}
</code>
I haven't had trouble compiling it, but why hasn't the constant
reference bound to the return from Func() gone out of scope when
Munky() returns?
(1) Natural life-span of a dog: About 12 years.
(2) Natural life-span of a human: About 80 years.
(3) Natural life-span of a temporary object in C++: Until the end of the
statement.
The reason I say "natural" is because things can interfer. Dogs and
humans can die before their time. Temporaries however, cannot die before
their time, BUT their lifetime can be extended by binding them to a const
reference. Without binding it to a const reference though, you can be
sure it will perish at the end of the statement -- not before and not
after. Simple way of thinking about it: It lives until the semi-colon.
Your second code snippet works perfectly because the temporary returned
from "Func" is still in existence when "Funky" is called. However, you
still have the dubious situation of "Is the temporary actually non-
const?".
-Tom?s
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]