赋值运算符与用户自定义构造函数的关系
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
构造函数禁用它。
#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
构造函数禁用它。