c++ - 具有引用成员的赋值运算符

标签 c++ reference

这是创建具有引用成员的赋值运算符的有效方法吗?

#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/

相关文章:

c++ - 计算双C++中的位数

c++ - "typename qualified-id"引用非类型参数声明中的类型

c++ - C++中的引用代表对象吗?

python - 使用 getattr 获取方法的对象引用

c++ - 局部数组长度与从函数调用时不同

c++ - QListView更新-不触发更新

c++使用指针和状态机构建递归树

C++ 在另一个对象中引用一个对象的当前状态

c++ - 为什么 C 选择某些运算符作为它们的符号?

c++ - 作为类成员的常量引用