我试图弄清楚为什么以下代码片段调用LValue cast操作符重载:
#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;
}
当前输出为:但是根据我的理解,
Fool()
返回一个rvalue
,并且由于const&
可以绑定(bind)到rvalues
,因此无需构造lvalue Foo
。谁能解释为什么构造
lvalue
?我相信这是一个悬挂的lvalue
。 最佳答案
好的,所以这里要注意的是,重载解析仅考虑i
的一个转换函数。他们都不参加,因此引用限定词不能用来区分他们。对于绑定(bind)引用的情况
根据粗体文本,在初始化i
时,我们的唯一候选对象是operator int const&
。因此,重载解决方案可以通过此处,也可以完全失败。但是它不能选择operator int
,因为甚至没有考虑该代码。它之所以成功,是因为const限定的左值引用可以绑定(bind)到对象参数。
另一方面,用于初始化值
因此,在初始化j
时,两个转换函数都作为重载参与,在此引用限定符有所不同。
您在这里确实得到了一个悬而未决的引用资料,这似乎是由于该语言中的一个黑角。引用的第一段中的项目符号可能经过改进,可以考虑更好地绑定(bind) const lvlaue引用。由于这些也可能绑定(bind)到临时对象,因此理想情况下,您的第二个转换运算符可以成为更好规则下的候选对象。
关于c++ - 在RValue对象上调用LValue ref合格成员函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60427227/