我最近更新了运算符重载方面的 C++ 知识。按照建议,我返回对 *this
的引用以获取“=”的运算符重载
。但是后来我发现了一个问题:-
#include <iostream>
using namespace std;
class MyClass
{
int num = 4;
public:
MyClass() = default;
MyClass(int x) : num(x) {}
void getnum(int x)
{
num = x;
}
void shownum()
{
cout << num << '\n';
}
MyClass& operator = (const MyClass& obj) // works even without const
{
this->num = obj.num;
return *this;
}
~MyClass() = default;
};
int main()
{
MyClass x, y(5), z(7);
z = MyClass(8) = y; // temporary object return reference
x.shownum();
y.shownum();
z.shownum();
}
此代码不会生成 UB
,即使其中涉及一个临时对象 MyClass(8)
,其间将等同于 y
(很好,没问题)但是随后它的引用将被发送以等同于 z
。为什么悬挂引用
问题不会出现在这里?为什么重载函数在临时对象“MyClass(8) 上没有const MyClass&”的情况下工作?
最佳答案
临时变量一直存在到完整的表达式结束。最后,临时文件消失了,但到那时所有分配都已执行,并且由于您没有将引用存储在任何地方,所以临时文件消失是可以的。
关于c++ - 为类重载 = 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39057061/