2015-12-27 3 views
11

Думая о (х | г | л | рг | ГЛ) значений, следующий вопрос пришел мне на ум:Переменные, объявленные &&

Рассмотрим следующие два объявления переменных:

X x = ...; 

и

X&& x = ...; 

и предположим, что ... сделать не доставить xvalue.

Может кто-нибудь подумать о коде не с использованием decltype, в котором это имеет значение? В обоих случаях (x) будет lvalue типа X, не так ли?

+1

Я имею в виду разницу в использовании переменных, так что заявленные. – JohnB

ответ

4

аргументы шаблона не типа cannot refer to a temporary. Таким образом, учитывая

struct X {}; 
X purr() { return {}; } 

X x1 = purr(); 
X&& x2 = purr(); 

template<X&> class woof {}; 

мы имеем

woof<x1> w1; // OK 
woof<x2> w2; // Error 

Если ... не ограничивается prvalue типа X, то нарезка менее неясным способ сделать два неэквивалентных. Дано:

struct X { virtual ~X() = default; }; 
struct Y : X {}; 

Y meow() { return {}; } 

Тогда:

X x1 = meow();  // slices 
X&& x2 = meow();  // doesn't slice 

Таким образом:

dynamic_cast<Y&>(x1); // throws std::bad_cast 
dynamic_cast<Y&>(x2); // OK 
+0

Это очень приятно. Спасибо. – JohnB

6

Может быть искусственный пример, но с

struct X 
{ 
    X() = default; 
    X(const X&) = delete; 
    X operator =(const X&) = delete; 
    X(X&&) = delete; 
    X operator =(X&&) = delete; 
}; 

X makeX() {return {};} 

следующие компилирует

X&& x = makeX(); 

тогда нижеперечисленного не

X x = makeX(); 
+0

Ссылка 'const' тоже будет работать, если вы не возражаете против постоянной. –

+0

Благодарим вас за ответ и комментарии. Я не знал об этом, поэтому я кое-что узнал. Тем не менее, мой вопрос нацелен скорее на код с использованием переменной. – JohnB

+1

Комментарий: Это странно. «&&» кажется, что «x» - это то, от чего вы должны перейти, но ваш пример работает по тому факту, что вы * не можете * переместить 'X's. – JohnB

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