2013-09-15 3 views
1

В последние несколько дней я пытался понять, по-видимому, тривиальный принцип за ссылками lvalue/rvalue. Определим новый RValue ссылка: поэтому, связывающий выражение lvalue типа T &&

int&& x = 12; 

x является именующее выражение типа int&&. Так как x является значением lvalue, оно может быть привязано к ссылочной позиции lvalue того же типа, то есть ссылку на lvalue типа int&&. Такой именующая ссылка будет определяться как:

int&& & ref_x = x; // non-working code, just for the sake of explanation 

Конечно, это не представляется возможное явно определить ссылку на ссылку, и правильный способ выполнить связывание следующим образом:

int& ref_x = x; 

C++ Primer сообщает следующее об использовании ссылок в инициализаторах:

когда мы используем ссылку как инициализатор, мы действительно с помощью объекта, на который делается ссылка б ound

С другой стороны, ссылка lvalue должна соответствовать типу выражения lvalue. Что мне не хватает? В этом случае задействован ссылочный коллапс?

Спасибо.

ответ

1

No, x (в качестве выражения) является выражением типа int. Тип значения выражения никогда не является ссылкой. Фактически, x также lvalue, так как это названная вещь.

Кроме того, ссылки по ссылкам отсутствуют по той же причине: ссылки привязаны к значениям, а значения никогда не ссылаются.

Если вы когда-либо смущены, просто продолжайте говорить себе: значение выражения всегда является типом объекта. Является ли значение категорией выражения l или r только определяет, к каким вещам может привязываться значение; он не влияет на его тип.

+0

Как насчет следующего утверждения из статьи «Универсальные ссылки в C++ 11» Скотта Мейера: «Поскольку плотность или простота выражения не зависит от его типа, возможно иметь lvalues, тип которых является ссылкой rvalue, и также возможно иметь rvalues ​​типа rvalue reference "_? –

+0

@ burton0: Не знаю. Может быть, он означает, что переменная, являющаяся ссылкой rvalue, может выражать выражение, которое является lvalue? –

+0

«Тип значения выражения никогда не является ссылкой». Я не уверен, что вы имеете в виду с * типом значения выражения *, но тип 'static_cast (x)' является ссылкой на lvalue, а его категория значений - lvalue. Скотт Мейерс также использует [примеры в качестве примера] (http://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers). – dyp

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