在下面的代碼中,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);
}
但隨着右值引用它似乎不是如此。
你可以使用一些簡化的規則:如果var有一個名字 - 它的左值 –
'rvalref'是一個左值。 'decltype(標識符)'的結果可能與由該標識符組成的表達式的值類別不一樣 –
您鏈接到的問題的答案也會回答您的問題,儘管它是一個稍微不同的問題 –