赋值运算符和用户定义的构造函数之间的关系

时间:2017-10-09 16:45:25

标签: c++ assignment-operator

#include <iostream>

class A{
};

class B: public A{
public:
    B(A&& inA){
        std::cout<<"constructor"<<std::endl;
    }
};

int main(){
    B whatever{A{}};
    whatever=A{};
}

此输出

constructor
constructor

至少使用C ++ 14标准和GCC。如何定义赋值运算符可以导致调用构造函数而不是operator=?赋值运算符的这个属性是否有名称?

1 个答案:

答案 0 :(得分:3)

因为你遇到了所有的conditions for generating a move-assignment operator。编译器为您合成的移动赋值运算符的形式为:

B& operator=(B&&) = default;

回想一下,临时工具可以绑定到 const左值引用右值引用。在Implicit Conversion Sequences之后,您的临时A{}将转换为临时B,用于进行移动分配。您可以使用explicit构造函数禁用此功能。