2014-11-07 4 views
2

Это простой и старый вопрос. Я уверен, что его нужно спросить в другом месте. Но после более чем 30 минут поиска в Google я решил снова попросить здесь. Поток информации о ссылке rvalue затрудняет поиск правильных веб-страниц для этой проблемы.Почему Rvalue не может связывать ссылку Lvalue?

В чем причина такого решения, что rvalues ​​не может связывать ссылки lvalue?

+0

Если я правильно понял, rvalues ​​являются временными, тогда как lvalues ​​все еще живут после окончания выражения. Не имеет смысла связывать «постоянное» значение с временным. – SlySherZ

+0

@SlySherZ Это правильно. Однако в стандарте говорится, что мы можем связывать rvalues ​​с константными ссылками lvalue. Затем жизнь rvalue распространяется на срок службы константы. Почему ссылки lvalue (без const) не могут иметь такое поведение, как ссылки на константу lvalue? – Sungmin

+0

Я думаю, что это связано с оптимизацией компилятора (rvalues ​​являются постоянными, что позволяет компилятору обрабатывать их более эффективным способом). Если вы хотите эффективно привязать и изменить значение rvalue, вы можете использовать семантику перемещения (https://stackoverflow.com/questions/3106110/what-are-move-semantics). –

ответ

3

Rvalues ​​обычно что-то умирают или буквально. Если этот код является законным:
int &r = 5
тогда вы сможете изменить 5, но это не имеет смысла! Ссылка (любого вида) является просто псевдонимом для объекта, на который делается ссылка.
Однако ссылки lvalue для const запрещают любое изменение объекта, и поэтому вы можете привязать их к значению r.
const int &r = 5; // ok r = 10; // compilation error

+1

Некоторые компиляторы разрешают 'int &r = 5;' в качестве расширения, поэтому он имеет смысл, он просто не допускается стандартом. –

+0

Спасибо. Я понимаю вашу мысль. Я думал, что есть некоторые технические проблемы (или приводит к некорректному коду), если мы допустим такое правило. Но даже без таких вещей все еще кажется правдоподобным. – Sungmin

+0

@NeilKirk "just"? AFAIK, что стандарт не определяет, не имеет смысла. – edmz

Смежные вопросы