C++:未调用赋值运算符

C++: assignment operator not called

我有下面的代码。

当我写o1 = o2时,调用void operator=(TestClass& _rhs)。没关系。

但是当我执行 o1 = test_function(); 时,首先调用 operator float(),然后调用 void operator=(float _value)。逻辑上是正确的,但是为什么void operator=(TestClass& _rhs)没有调用?

class TestClass
{
public:
    TestClass(float _value)
    {
        value = _value;
    }

    operator float()
    {
        return value;
    }

    void operator=(float _value)
    {
    }

    void operator=(TestClass& _rhs)
    {
    }

private:
    float value;
};

TestClass test_function()
{
    TestClass result = 0;
    return result;
}

int main()
{
    std::cout << "Hello World!\n"; 

    TestClass o1(1), o2(1);

    o1 = o2;

    o1 = test_function();
}

why void operator=(TestClass& _rhs) is not involved?

因为赋值运算符格式不正确。应该是:

void operator=(TestClass const& _rhs)
//                CONST! ^^^^^

您的表单 void operator=(TestClass& _rhs) 将不接受纯右值(临时值),例如从 test_function() 返回的临时值。

因此,您的代码中唯一的 有效 赋值是 void operator=(float _value),这是可能的,因为您的 class 可以隐式转换为 float.

您应该为 TestClass 声明不同的 operator=。要么使用

void operator=(const TestClass& _rhs)

void operator=(TestClass _rhs)

这是因为函数 test_functions returns 是一个临时值,您不能临时绑定到非常量左值引用。这就是为什么选择另一个 operator=(float) 的原因。

您可以在此处找到重载解析规则:https://riptutorial.com/cplusplus/example/8117/steps-of-overload-resolution