在下面的代码中,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);
}
但是对于右值引用,情况似乎并非如此。
最佳答案
rvalref
是对象的标识符。对象的标识符始终是左值。
表达式从来没有引用类型。表达式 rvalref
具有类型 int
和值类别“lvalue”。
在声明 int && rvalref
中,&&
描述了 rvalref
将如何初始化(即通过向表示的对象添加新名称通过另一个表达式,而不是创建一个新对象),仅此而已。
在表达式中,对象名称的行为是相同的,无论该名称是否为该对象的第一个名称。
与 decltype(general_expression)
相比,代码 decltype(identifier)
具有特殊的行为。它不给出由该标识符组成的表达式的类型和值类别。代码 decltype((identifier))
可以做到这一点。 Further reading
关于c++ - 为什么 rval ref 绑定(bind)到 lval ref 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42040513/