在下面的代码中,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(标识符)'的结果可能与由该标识符组成的表达式的值类别不一样 –
您链接到的问题的答案也会回答您的问题,尽管它是一个稍微不同的问题 –