C++ 编译器生成的复制构造函数/赋值是否呈现';具有常量/易失性的s参数
有一些函数,编译器可以在需要时隐式地为我们定义,如果可以为该类正确地定义它们的话。像C++ 编译器生成的复制构造函数/赋值是否呈现';具有常量/易失性的s参数,c++,constants,compiler-generated,C++,Constants,Compiler Generated,有一些函数,编译器可以在需要时隐式地为我们定义,如果可以为该类正确地定义它们的话。像 默认构造函数 复制构造函数 赋值运算符 析构函数 所以,编译器生成的复制构造函数/赋值是将其参数作为常量引用还是非常量引用 class Test { public: Test(const Test&); << _1 Test(Test&); << _2 }; 类测试 { 公众: 测试(常数测试&)注释中提供的Pr
- 默认构造函数
- 复制构造函数
- 赋值运算符
- 析构函数
常量引用
还是非常量引用
class Test
{
public:
Test(const Test&); << _1
Test(Test&); << _2
};
类测试
{
公众:
测试(常数测试&)注释中提供的Pradhan中的规则可以直观地理解如下:编译器将尝试使用参数const T&
定义副本构造函数(如果可能);如果没有,则将尝试使用参数T&
定义副本构造函数;如果也不可能,则复制构造函数将被定义为已删除
当类类型为T
的对象被复制时,它的基类和非静态数据成员也必须被复制。因此,如果其中一个,比如说,U
有一个复制构造函数,它采用U&
而不是const U&
,那么如果T
的构造函数采用const T&
,那么所有子对象都将l然后也是cv限定的,并且您无法获得U&
。因此,编译器必须放弃使用const t&
的复制构造函数,转而使用t&
。同样,如果某个基类或非静态数据成员不能被复制,那么编译器使用为T
生成已删除的副本构造函数
对于复制赋值运算符,规则基本相同,只是编译器查找基类和非静态数据成员的复制赋值运算符(而不是它们的复制构造函数),并且允许复制赋值运算符按值获取参数(与复制构造函数不同).隐式定义的复制构造函数的规则可能会有所帮助。根据链接,它是const Test&
或Test&
,具体取决于类父类的复制构造函数。