2017-02-04 37 views
1

在下面的代碼中,is_rvalue_reference返回true。 我期望調用testRef(int &&)而不是testRef(int &),但事實並非如此(至少在我的Visual Studio 2015編譯器中)。爲什麼rval ref綁定到lval ref函數?

任何想法的原因是什麼?

void testRef(int&& i) 
{ 
    cout << "called testRef(int&&) " << endl; 
} 

void testRef(int& i) 
{ 
    cout << "called testRef(int&) " << endl; 
} 

int main() 
{ 
    int && rvalref = 4; 
    cout << "is rval? : " << std::is_rvalue_reference<decltype(rvalref)>() << endl; 
    testRef(rvalref); 
} 

注意,這是問題的不同之處Rvalue Reference is Treated as an Lvalue?

在那個崗位,他們都在談論可變功能:這就像問是否在我的例子中,變量i是一個右值或一個左值(答案是它在兩種情況下都是左值,因此它在兩種情況下都有一個地址)。

有rvalues和std::move,這是一個右值的強制轉換,允許在函數和構造函數中選擇正確的重載。 例如下面的兩個案例解析到一個呼叫testRef(int && i)

int main() 
{ 
    int g = 3; 
    testRef(std::move(g)); 
    testRef(4); 
} 

但隨着右值引用它似乎不是如此。

+0

你可以使用一些簡化的規則:如果var有一個名字 - 它的左值 –

+0

'rvalref'是一個左值。 'decltype(標識符)'的結果可能與由該標識符組成的表達式的值類別不一樣 –

+0

您鏈接到的問題的答案也會回答您的問題,儘管它是一個稍微不同的問題 –

回答

1

rvalref是對象的標識符。對象的標識符總是左值。

表達式從來沒有引用類型。表達式rvalref的類型爲int,值類別爲「左值」。

在聲明int && rvalref,所述&&描述rvalref將如何被初始化(即,通過增加一個新的名字由另一個表達式來表示,而不是創建新的對象的對象),而這一切。

在一個表達式中,對象名稱的行爲是相同的,無論該名稱是否是給予該對象的第一個名稱。

代碼decltype(identifier)有特殊的行爲,與decltype(general_expression)相比。它不給出由該標識符組成的表達式的類型和值類別。代碼decltype((identifier))會這樣做。 Further reading