赋值运算符与用户自定义构造函数的关系

Relationship between assignment operator and user-defined constructor

#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=?这个 属性 的赋值运算符有名称吗?

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

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

回想一下,临时对象可以绑定到 const 左值引用 右值引用 。通过 Implicit Conversion Sequences,您的临时 A{} 被转换为用于进行移动分配的临时 B。您可以使用 explicit 构造函数禁用它。