Как узнать, успешно ли подписана заметка на тему?

В вашем коде 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
0
задан codekaizer 18 January 2019 в 07:02
поделиться