2016-07-16 2 views
4

То, что я думаю о чем-то вроде X&& x = static_cast<X&&>(obj_x);, заключается в том, что, несмотря на появление, x заканчивается тем, что является обычной ссылкой на значение lvalue. Недавно я столкнулся с this article, где Скотт Мейерс настаивает на том, что x будет lvalue ссылки типа rvalue. Разве это действительно значимо, или это различие без разницы? В частности, учитывая либоВ C++, имеет смысл сказать, что переменная имеет тип rvalue reference?

X&& x = static_cast<X&&>(obj_x) 

или

X& x = obj_x; 

есть любой последующий код, который будет вести себя по-разному для этих двух определений x?

+1

'decltype (x)'. Если 'x' - нестатический член данных, это также влияет на генерацию конструктора копирования. – cpplearner

+0

Почему бы не включить этот комментарий в ответ? – Ari

ответ

1

Важным отличием является то, что ссылка на R-значение называется или неназванной (возвращаемое значение).

Таким образом, чтобы ответить на вопрос, как написано, нет, нет последующего кода не будет рассматривать два определения х по-разному (кроме как cpplearner упоминает, decltype()). Только определение x имеет значение в том, что ссылка может связываться с (причудливый термин, который поможет веб-поискам).

Все, что имеет имя, может быть отнесено к другому, поэтому оно обрабатывается как l-значение для привязки к последующим ссылкам. Зачем? Поскольку основная причина для ссылок на r-значение состоит в том, чтобы позволить что-то быть перемещено с. После того, как вы перейдете от него, это уже невозможно. Все, что вы можете сделать, это уничтожить его или назначить над ним. Неважно, если вещь не имеет имени, но если у нее есть имя, ее легко случайно использовать снова. Вот почему вам нужно вызвать std :: move (mything), чтобы выйти из mything [за исключением некоторых случаев возврата].

Я думаю, что это была статья Херба Саттера, которая заставила меня получить эту деталь, к сожалению, я не могу найти ее прямо сейчас. Если я ошибаюсь, это может быть Стефан Т. Лававей.

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