在需要的情况下,编译器可以隐式为我们定义一些函数,以及是否可以为该类正确定义它们。喜欢
因此,编译器生成的复制构造函数/赋值是否将其参数视为const-reference
或non-const-reference
。
class Test
{
public:
Test(const Test&); << _1
Test(Test&); << _2
};
如果确实如此,那么该决定的指导因素是什么。
答案 0 :(得分:1)
注释中提供的link Pradhan中的规则可以直观地理解如下:编译器将尝试来定义具有参数const T&
的复制构造函数如果可能的话;如果没有那么它将尝试来定义带有参数T&
的复制构造函数;如果这也不可能,则复制构造函数将被定义为已删除。
复制类类型T
的对象时,也必须复制其基类和非静态数据成员。因此,如果其中一个,例如U
有一个复制构造函数,而U&
代替const U&
,那么如果T
的构造函数需要const T&
,那么这是一个禁忌U&
1}}因为所有子对象也将被cv限定,并且你无法获得const T&
。因此,编译器必须放弃制作一个需要T&
的复制构造函数,而不是T
。同样,如果某些基类或非静态数据成员无法被复制,那么编译器为{{1}}生成已删除的复制构造函数是有意义的。
对于复制赋值运算符,规则基本相同,只是编译器查找基类和非静态数据成员(而不是它们的复制构造函数)的复制赋值运算符,并且允许复制赋值运算符使用它们按值的参数(与复制构造函数不同)。