2016-08-21 72 views
2

的事情是,的C++编程语言第四版说的显式声明隐式生成的构造函数:与析构函数

在这种特殊情况下,如果你忘记删除复制或移动操作,没有任何的损害。 A 对于用户已经显式声明析构函数的类,不会隐式地生成移动操作。 此外,在这种情况下(第44.2.3节),不赞成使用复制操作。这 可以是一个很好的理由,甚至明确定义析构函数,其中,编译器会隐含地 提供一个(§17.2.3)。

我试过这段代码:

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

而且这里没有错误和产生的异常。我知道复制构造函数应该隐式地在C++ 98中生成,但是第四种说复制已被弃用。这是什么意思?

回答

1

我的理解是,一个隐式声明的构造是没有必要的隐式定义。

cppreference

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

隐式定义的由编译器拷贝构造
如果隐式地声明的复制构造既不删除也不琐碎,它被定义(即,产生一个函数体和编译)如果使用ODR-。如果T具有用户定义的析构函数或用户定义的复制赋值运算符
的隐式定义的复制构造的生成已被弃用。

所以你的情况,拷贝构造函数是隐式声明,但不隐式定义如果不是ODR使用的,这基本上意味着,除非需要它的地方没有定义。

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

+0

谢谢Nelxiost – user2923317