隐式生成的构造函数,具有显式的析构函数声明

时间:2016-08-21 18:34:34

标签: c++11 default-constructor default-copy-constructor

问题是,第四版C ++编程语言说:

在这种特殊情况下,如果您忘记删除副本或移动操作,则不会造成任何伤害。一个 对于用户已明确声明析构函数的类,不会隐式生成move操作。 此外,在这种情况下,不推荐使用复制操作的生成(第44.2.3节)。这个 即使编译器会隐式地显式定义析构函数,也是一个很好的理由 提供了一个(第17.2.3节)。

我试过这段代码:

#include <iostream>
class Foo {
public:
    ~Foo() {}
}
int main() {
    Foo x;
    Foo y(x);
    return 0;
}

这里没有错误和遗漏。我知道复制构造函数应该在c ++ 98中隐式生成,但是第4版表示不推荐使用复制。这是什么意思?

1 个答案:

答案 0 :(得分:1)

我的理解是隐式声明的构造函数不需要隐式定义。

来自cppreference

  

隐式声明的复制构造函数
  如果没有为类类型(结构,类或联合)提供用户定义的副本构造函数,则编译器将始终将副本构造函数声明为其类的非显式内联公共成员。

     

隐式定义的复制构造函数
  如果隐式声明的复制构造函数既不被删除也不是微不足道的,如果使用了odr,则编译器会定义它(即,函数体被生成并编译)。   如果T具有用户定义的析构函数或用户定义的复制赋值运算符,则不推荐使用隐式定义的复制构造函数。

因此,在您的情况下,复制构造函数是隐式声明的,但如果没有使用odr,则不会隐式定义,这基本上意味着除非在某处需要,否则它不会被定义。

另请参阅:What is the distinction between implicitly-declared and implicitly-defined copy constructors?