2

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

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

我试过这段代码:

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

并且这里没有错误和例外。我知道应该在 c++98 中隐式生成复制构造函数,但是 4th 说不推荐使用复制。这是什么意思?

4

1 回答 1

1

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

cppreference

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

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

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

另请参阅:隐式声明和隐式定义的复制构造函数有什么区别?

于 2016-08-21T19:25:02.447 回答