这是创建具有引用成员的赋值运算符的有效方法吗?
#include <new>
struct A
{
int &ref;
A(int &Ref) : ref(Ref) { }
A(const A &second) : ref(second.ref) { }
A &operator =(const A &second)
{
if(this == &second)
return *this;
this->~A();
new(this) A(second);
return *this;
}
}
它似乎编译和运行良好,但由于 c++ 倾向于在最意想不到的时候出现未定义的行为,而且所有人都说这是不可能的,我认为我错过了一些问题。我错过了什么吗?
最佳答案
语法正确。但是,如果放置 new 抛出,您 最终得到一个无法破坏的对象。更别提灾难 如果有人从您的类(class)派生。只是不要这样做。
解决方法很简单:如果类需要支持赋值,不要 使用任何引用成员。我有很多可以引用的类(class) 参数,但将它们存储为指针,以便类可以支持 任务。比如:
struct A
{
int* myRef;
A( int& ref ) : myRef( &ref ) {}
// ...
};
关于c++ - 具有引用成员的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7906127/