在RValue对象上调用LValue ref限定成员函数

问题描述 投票:2回答:1

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

c++ rvalue lvalue ref-qualifier
1个回答
0
投票
对于const int& i = Fool();,返回const int&的左值参考限定的转换运算符比右值参考限定的转换运算符更好,并且在重载分辨率中获胜。

我相信这是一个悬空的左值

是,i是一个悬挂的参考。

您可能希望使其引用非常量。例如

operator const int& () & { std::cout << "lvalue\n"; return i; } operator int () && { std::cout << "rvalue\n"; return i; }

LIVE

© www.soinside.com 2019 - 2024. All rights reserved.