В вашем коде getx()
возвращается временный объект, так называемый «rvalue». Вы можете скопировать rvalues в объекты (aka. Variables) или привязать их к ссылкам const (что продлит их срок службы до конца жизненного цикла ссылки). Вы не можете привязывать значения r к неконстантным ссылкам.
Это было преднамеренное дизайнерское решение, чтобы пользователи случайно не изменяли объект, который умрет в конце выражения:
g(getx()); // g() would modify an object without anyone being able to observe
Если вы хотите сделать это вам придется сначала сделать локальную копию или объект или связать его с ссылкой на const:
X x1 = getx();
const X& x2 = getx(); // extend lifetime of temporary to lifetime of const reference
g(x1); // fine
g(x2); // can't bind a const reference to a non-const reference
Обратите внимание, что следующий стандарт C ++ будет включать ссылки rvalue. То, что вы знаете как ссылки, становится, таким образом, называться «ссылками на lvalue». Вам будет позволено связывать rvalues с rvalue ссылками, и вы можете перегружать функции на «rvalue-ness»:
void g(X&); // #1, takes an ordinary (lvalue) reference
void g(X&&); // #2, takes an rvalue reference
X x;
g(x); // calls #1
g(getx()); // calls #2
g(X()); // calls #2, too
Идея ссылок на rvalue заключается в том, что, поскольку эти объекты все равно будут умирать, вы могут воспользоваться этими знаниями и реализовать так называемую «семантику перемещения», определенную оптимизацию:
class X {
X(X&& rhs)
: pimpl( rhs.pimpl ) // steal rhs' data...
{
rhs.pimpl = NULL; // ...and leave it empty, but deconstructible
}
data* pimpl; // you would use a smart ptr, of course
};
X x(getx()); // x will steal the rvalue's data, leaving the temporary object empty