编译器生成的复制构造函数/赋值是否使用const / volatile呈现它的参数

时间:2014-12-24 06:15:08

标签: c++ const compiler-generated

在需要的情况下,编译器可以隐式为我们定义一些函数,以及是否可以为该类正确定义它们。喜欢

  • 默认构造函数
  • 复制构造函数
  • 赋值运算符
  • 析构函数。

因此,编译器生成的复制构造函数/赋值是否将其参数视为const-referencenon-const-reference

class Test
{
  public:
    Test(const Test&);      << _1
    Test(Test&);            << _2 
};

如果确实如此,那么该决定的指导因素是什么。

1 个答案:

答案 0 :(得分:1)

注释中提供的link Pradhan中的规则可以直观地理解如下:编译器将尝试来定义具有参数const T& 的复制构造函数如果可能的话;如果没有那么它将尝试来定义带有参数T&的复制构造函数;如果这也不可能,则复制构造函数将被定义为已删除。

复制类类型T的对象时,也必须复制其基类和非静态数据成员。因此,如果其中一个,例如U有一个复制构造函数,而U&代替const U&,那么如果T的构造函数需要const T&,那么这是一个禁忌U& 1}}因为所有子对象也将被cv限定,并且你无法获得const T&。因此,编译器必须放弃制作一个需要T&的复制构造函数,而不是T。同样,如果某些基类或非静态数据成员无法被复制,那么编译器为{{1}}生成已删除的复制构造函数是有意义的。

对于复制赋值运算符,规则基本相同,只是编译器查找基类和非静态数据成员(而不是它们的复制构造函数)的复制赋值运算符,并且允许复制赋值运算符使用它们按值的参数(与复制构造函数不同)。