在下面的代码中,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);
}
但是对于右值引用,情况似乎并非如此。