【问题标题】:Implicitly-generated constructors with explicit declaration of destructor显式声明析构函数的隐式生成构造函数
【发布时间】:2016-12-28 07:12:17
【问题描述】:

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

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

我试过这段代码:

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

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

【问题讨论】:

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


    【解决方案1】:

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

    来自cppreference

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

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

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

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

    【讨论】:

    • 谢谢你,Nelxost
    猜你喜欢
    • 2021-11-20
    • 2018-06-11
    • 2012-07-19
    • 2012-11-09
    • 2020-01-21
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多