2016-05-30 5 views
6

Так как C++ предоставляет ссылки на rvalues, то есть ссылки rvalue, которые в основном используются для выполнения семантики перемещения и других важных для памяти задач. Но в следующем случае ссылка меняет значение литерала, но, как мы знаем, литералы читаются только так, как ссылка может изменить значение некоторой переменной только для чтения. Описывает ли ссылка rvalue свою собственную память или просто изменяет значение литерала?C++: справочная память rvalue

#include <iostream> 
using namespace std; 

int main() 
{ 
    int a = 5; 
    int&& b = 3; 
    int& c = a; 
    b++; 
    c++; 
    cout << " Value for b " << b << " Value for c " << c << endl; 
} 

Во-вторых, когда временному объекту присваивается ссылка, ссылка работает с данными этого объекта. Но в соответствии с определением временных объектов они удаляются так же, как когда выражение, использующее их, заканчивается. Как ссылка может служить псевдонимом для этого временного объекта, если этот временный объект не работает?

ответ

12

Числовые литералы не могут быть привязаны ни к какой ссылке, ни к значению rvalue, ни к значению lvalue. Понятно, что числовой литерал создает временный объект, инициализированный из литерального значения, и это временное может быть привязано к ссылкам rvalue или к const lvalue reference (int const& r = 17;). По-видимому, соответствующая цитата на литералах - это 5.1.1 [expr.prim.general], пункт 1:

Литерал является основным выражением. Его тип зависит от его формы (2.14). Строковый литерал - это значение lvalue; все другие литералы - это prvalues.

При привязке ссылки непосредственно к временному, срок ее жизни продлевается до тех пор, пока ссылка не выходит за пределы области. Соответствующий раздел для выпуска срока службы - 12.2 [class.temporary], пункт 5:

Второй контекст - это когда ссылка привязана к временному. Временный, к которому ссылка привязана или временное, что является полным объектом подобъекта, к которому ссылка привязана сохраняется в течение всего срока ссылки, за исключением:

  • Временной границы с опорным элементом в Конструктор-инициализатор конструктора (12.6.2) сохраняется до выхода конструктора.
  • Временная привязка к эталонному параметру в вызове функции (5.2.2) сохраняется до завершения полного выражения, содержащего вызов.
  • Срок службы временной привязки к возвращаемому значению в операторе возврата функции (6.6.3) не продлевается; временное уничтожается в конце полного выражения в операторе return.
  • Временная привязка к ссылке в новом инициализаторе (5.3.4) сохраняется до завершения полного выражения, содержащего новый-инициализатор.
+0

Эй, из которых ссылки вы говорите номер раздел, как '(5.1.1) пункт 1' –

+1

@HarshulSharma: Я цитирую стандарт C++ на месте во время поста. В случае вышеуказанной статьи, которая соответствует ISO/IEC 14882: 2014. Эти документы можно приобрести у национальных организаций по стандартизации. Некоторые _drafts_ доступны (см. Страницу [open std] (http://www.open-std.org/JTC1/SC22/WG21/) для некоторых ссылок). Мои ссылки обычно включают как номер раздела, так и _stable reference_, например «[expr.prim.general]»: номер раздела, точная формулировка и номера абзацев могут меняться, но остаются стабильные ссылки. В цитируемом тексте используется ссылка, как в цитируемом тексте. –

+0

Спасибо, я не знал, что РГ21 также публикует окончательный проект. Я только думал, что они просто выпускают разные проекты для разных концепций. Теперь я думаю, что получил надежную ссылку.Спасибо большое :) :) –

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