在下面的代码中,is_rvalue_reference返回true。我希望testRef(int &&)被调用,而不是testRef(int &),但事实并非如此(至少我的Visual 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是rvalue还是lvalue (答案是在这两种情况下都是lvalue,因为在这两种情况下它都有一个地址)。
拥有rvalue和std::move (这是对rvalue的强制转换)的全部意义是允许在函数和构造函数中选择正确的重载。例如,以下两种情况都解决了对testRef(int && i)的调用
int main()
{
int g = 3;
testRef(std::move(g));
testRef(4);
}但就参考价值而言,情况似乎并非如此。
发布于 2017-02-05 03:12:59
rvalref是对象的标识符。对象的标识符始终是lvalue。
表达式从来没有引用类型。表达式rvalref有类型int和值类别"lvalue“。
在声明int && rvalref中,&&描述了如何初始化rvalref (即向另一个表达式表示的对象添加一个新名称,而不是创建一个新对象),仅此而已。
在表达式中,无论名称是否为对象的第一个名称,对象名称的行为都是相同的。
与decltype(identifier)相比,代码decltype(general_expression)具有特殊的行为。它不给出由该标识符组成的表达式的类型和值类别。代码decltype((identifier))就能做到这一点。Further reading
https://stackoverflow.com/questions/42040513
复制相似问题