在下面的代码中,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是左值还是左值(答案是它是两种情况下的左值,因为它在两种情况下都有一个地址。)
具有rvalues和std::move
(它是rvalue的强制转换)的重点是允许在函数和构造函数中选择正确的重载。
例如,以下两种情况都解析为对testRef(int && i)
的调用:
int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}
但是使用右值参考似乎并非如此。
答案 0 :(得分:1)
rvalref
是对象的标识符。对象的标识符始终是左值。
表达式永远不会有引用类型。表达式rvalref
的类型为int
,值类别为“左值”。
在声明int && rvalref
中,&&
描述了如何初始化rvalref
(即通过向另一个表达式表示的对象添加新名称,而不是创建新对象), 就这样。
在表达式中,对象名称的行为是相同的,无论名称是否是赋予该对象的名字。
与decltype(identifier)
相比,代码decltype(general_expression)
具有特殊行为。它没有给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))
会这样做。 Further reading