Неконстантная ссылка может быть привязана только к lvalue

Может кто-нибудь объяснить, как имитировать эту ошибку? а также то, о чем это жалуется.

"Неконстантная ссылка может быть привязана только к lvalue" в С++

Ответ 1

Значение l, грубо говоря, может быть в левой части оператора присваивания. Ссылки предоставляют псевдонимы для других объектов:

std::string s;
std::string & rs = s;  // a non-const reference to s
std::string const & crs = s; // a const reference to s

Учитывая приведенные выше определения, ссылка на rs или crs совпадает с ссылкой на s, за исключением того, что вы не можете изменить указанную строку через crs, поскольку она является константой. Переменная - это lvalue, поэтому вам разрешено привязывать к ней не-const ссылку. Напротив, вы можете связывать ссылки const со временными значениями, как в:

std::string const & crs1 = std::string();

Однако следующее незаконно:

std::string & rs1 = std::string();

Это связано с тем, что с помощью ссылок, не содержащих константы, вы подразумеваете, что хотите изменить ссылочный объект. Однако временные ссылки, связанные с ссылками, уничтожаются, когда ссылка выходит за рамки. Поскольку это не всегда интуитивно, когда С++ создает временные объекты, привязка их к неконстантным ссылкам была запрещена, чтобы избежать неприятного сюрприза для изменения вашего объекта по своему усмотрению, просто чтобы увидеть, как он уничтожил несколько утверждений позже.

Ответ 2

Это означает, что вы не можете сделать что-то вроде этого:

void foo(int &x) { ... }
int bar()        { ... }

foo(bar());

Вам нужно сделать foo взять ссылку const или присвоить результат bar() переменной, а затем передать ее в foo.