Simple example:
struct A
{
A() : i(int()) {}
const int& i;
};
Error from gcc:
a temporary bound to ‘A::i’ only persists until the constructor exits
Rule from 12.2p5:
A temporary bound to a reference member in a constructor’s
ctor-initializer (12.6.2) persists until the constructor exits.
Question
Does anybody know the rationale for this rule? It would seem to me that allowing the temporary to live until reference dies would be better.
I don’t think the not extending to the object lifetime needs justification. The opposite would!
The lifetime extension of a temporary extends merely to the enclosing scope, which is both natural and useful. This is because we have tight control on the lifetime of the receiving reference variable. By contrast, the class member isn’t really “in scope” at all. Imagine this:
It’d be nigh impossible to define a meaningful lifetime extension for the
foo()temporaries.Instead, we have the default behaviour that the lifetime of the
foo()temporary extends to the end of the full-expression in which it is contained, and no further.