我试图弄清楚为什么以下代码片段调用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/

10-11 17:51