Yannick Tremblay wrote:
In article <47165e09$0$26728$426a74cc@news.free.fr>,
Michael DOUBEZ <michael.doubez@free.fr> wrote:
Daniel Lidstr?m a ?crit :
In article <4716585e$0$25087$426a74cc@news.free.fr>,
Michael DOUBEZ <michael.doubez@free.fr> wrote:
Daniel Lidstr?m a ?crit :
// create the pimpl instance without using new
Line::Line(const std::string& s) : m_pimpl(LineImpl(s)) {}
Your local is destroyed when going out of scope. Doesn't it ?
No it isn't. It is actually ok to bind a temporary object to a
const reference. There will be no "dangling" reference.
It is ok to bind it but that doesn't mean the lifetime of the
temporary is extended.
Example:
const std::string& foo()
{
return std::string("bar");
}
The value returned by foo() is an dangling reference.
Euh, it's not what he is doing, it's more like:
std::string foo()
{
return std::string("bar");
}
int main()
{
std::string const & val = foo();
...
It's neither. What he is doing is initialzing a reference member from
a temporary object. The lifetime of that object lasts exactly to the
end of the constructor call. Afterwards, i.e., for the entire lifetime
of the fully constructed object, the reference is dangling. From the
standard:
[...] A temporary bound to a reference member in a constructor?s
ctor-initializer (12.6.2) persists until the constructor exits. ...
[12.2/5]
This provision makes you wonder. What is the point of restricting the
life-time of the temporary to the duration of the constructor if the
object thus initialized is bound to have a dangling reference ever
after?
I don't have the Standard handy... but does it change the details since