我试图弄清楚为什么以下代码片段调用LValue强制转换运算符重载:
#include <iostream>
class Foo
{
public:
Foo(int i = 0) : i(i) {}
operator const int& () const &
{
std::cout << "lvalue\n";
return i;
}
operator int () const &&
{
std::cout << "rvalue\n";
return i;
}
int i = 0;
};
Foo Fool()
{
return Foo(5);
}
int main()
{
const int& i = Fool();
const int j = Fool();
return 0;
}
当前输出为:
左值
rvalue
但是据我了解,Fool()
返回一个rvalue
,并且由于const&
可以绑定到rvalues
,所以不需要构造lvalue Foo
。
[谁能解释为什么要构建lvalue
?我相信这是一个悬空的lvalue
。
const int& i = Fool();
,返回const int&
的左值参考限定的转换运算符比右值参考限定的转换运算符更好,并且在重载分辨率中获胜。我相信这是一个悬空的左值
是,i
是一个悬挂的参考。您可能希望使其引用非常量。例如
operator const int& () & { std::cout << "lvalue\n"; return i; } operator int () && { std::cout << "rvalue\n"; return i; }