由&&

2015-12-27 23 views
11

約思考聲明的變量(| R | L |公關| X GL)值,以下問題來到我的腦海:由&&

考慮以下兩個變量聲明:

X x = ...; 

X&& x = ...; 

,並承擔...提供的x值。

有誰能想到代碼不是使用decltype其中這有什麼區別?在這兩種情況下,(x)都會由一個類型爲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 

如果...不限於X型prvalue,然後切片是使兩個非相當於少模糊的方式。鑑於:

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'參考也可以工作,如果你不介意const。 –

+0

謝謝你的回答和評論。我沒有意識到這一點,所以我學到了一些東西。然而,我的問題更多的是使用變量的代碼。 – JohnB

+1

評論:這很奇怪。 &&似乎表明'x'是你應該離開的東西,然而你的榜樣僅僅是因爲你*不能移動'X'。 – JohnB