【发布时间】:2017-02-04 12:44:13
【问题描述】:
在下面的代码中,is_rvalue_reference 返回 true。
我希望调用testRef(int &&) 而不是testRef(int &),但事实并非如此(至少在我的Visual Studio 2015 编译器中)。
知道原因吗?
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 是右值还是左值(答案是它在两者中都是左值情况下,因为它在两种情况下都有地址)。
拥有右值和std::move(它是对右值的强制转换)的全部意义在于允许在函数和构造函数中选择正确的重载。
例如,以下两种情况都会调用testRef(int && i):
int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}
但是对于右值引用,情况似乎并非如此。
【问题讨论】:
-
你可以使用一些简化的规则:如果 var 有一个名字 - 它是一个左值
-
rvalref是一个左值。decltype(identifier)的结果可能与由该标识符组成的表达式的值类别不同 -
您链接到的问题的答案也回答了您的问题,尽管它是一个略有不同的问题
标签: c++ c++11 reference-binding