不使用赋值操作符的值替换

Value replacement without using the assignment operator

本文关键字:替换 赋值操作符      更新时间:2023-10-16

考虑这个最小的例子:

#include <iostream>
using namespace std;
class A
{
public:
    A() { cout << "Making A" << endl; }
    A& operator=(const A& other) = delete;
};

int
main(int argc, char* argv[])
{
    A a;
    a = A();
    return 0;
}

编译会产生以下错误:

$ g++ -std=c++11 -Wall test.cc -o test && ./test
test.cc: In function ‘int main(int, char**)’:
test.cc:17:7: error: use of deleted function ‘A& A::operator=(const A&)’
     a = A();
       ^
test.cc:9:8: error: declared here
     A& operator=(const A& other) = delete;
        ^

我想将a的值"重置"为新建的A。是否有一种方法可以让我只使用构造函数来做到这一点?也就是说,不使用在我的真实世界的代码中需要删除的赋值操作符?例如,我尝试使用std::movea = std::move(A());,但这给出了相同的错误。

只能调用一个对象的构造函数一次。在此之后,对象已经构造完成,不能再构造第二次。

你可以销毁对象并在适当的地方重建它:

a.~A();
::new (&a) A();

如果你发现自己需要经常这样做,最好只是提供一个.clear()成员或类似的东西…或者不删除赋值操作符。你没有提供足够的细节。