不使用赋值运算符进行值替换

时间:2016-11-04 20:20:16

标签: c++ c++11

考虑这个最小的例子:

#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;
        ^

我想&#34;重置&#34; a对新构建的A的值。有没有办法让我只使用构造函数来做到这一点?也就是说,不使用需要在我的真实代码中删除的赋值运算符?例如,我尝试使用std::move la a = std::move(A());,但这会产生同样的错误。

1 个答案:

答案 0 :(得分:4)

您只能调用一次对象的构造函数。之后,该对象已经构建,不能再次构建。

您可以销毁对象并在适当的位置重建它:

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

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