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
我有下面的代码。
当我写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