3

如果需要,编译器可以为我们隐式定义一些函数,并且是否可以为该类正确定义它们。喜欢

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

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

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

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

4

1 回答 1

1

Pradhan 在注释中提供的链接中的规则可以直观地理解如下:编译器将尽可能定义带参数的复制构造函数;如果不是,那么它将尝试使用参数定义一个复制构造函数;如果这也不可能,那么复制构造函数将被定义为已删除。const T& T&

当一个类类型的对象T被复制时,它的基类和非静态数据成员也必须被复制。因此,如果其中一个U有一个复制构造函数,U&而不是const U&,那么如果T的构造函数采用,那么它是不可行的,const T&因为所有子对象也将是 cv 限定的,并且您无法获得U&. 因此,编译器必须放弃制作一个接受 , 的复制构造函数,而改为const T&with T&。同样,如果某些基类或非静态数据成员无法复制,那么编译器生成已删除的复制构造函数是有意义的T

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

于 2014-12-24T06:35:11.133 回答