【问题标题】:Why does a class with a user-declared destructor have an implicitly defaulted constructor?为什么具有用户声明的析构函数的类具有隐式默认构造函数?
【发布时间】:2014-10-31 05:18:00
【问题描述】:

代码:

struct A
{ 
    ~A(){ };
};

A::A(){ }; //error: definition of implicitly declared default constructor

int main()
{
    A a;
}

DEMO

为什么代码会产生错误?我希望程序编译得很好。标准说N3797::12.8/7 [class.copy]:

如果类定义没有显式声明一个副本 构造函数,一个是隐式声明的。如果类定义 声明一个移动构造函数或移动赋值运算符, 隐式声明的复制构造函数被定义为已删除;否则, 它被定义为默认值(8.4)。 如果 类有一个用户声明的复制赋值操作符或一个用户声明的 析构函数。

这是一个错误还是我的误解?

【问题讨论】:

  • 你只能为你自己声明的函数提供定义......没有为隐式声明的函数提供非内联体这样的事情
  • @MattMcNabb 是的,我已经从答案中理解了。但是将这些功能标记为默认值有什么意义。它们已经由编译器声明了。
  • @DmitryFucintv:没有必要(假设你没有做任何导致函数被删除的事情)。有些人这样做是因为他们想非常明确地说明他们的类中可用的功能。很多人不赞成隐式声明的函数,而是希望每个函数都必须是显式的。
  • 这与您刚刚发布的问题完全不同。 (a) 将其标记为默认意味着该函数在它可能不存在时存在(例如,具有用户声明的析构函数的类的移动构造函数); (b) 自我证明
  • @DmitryFucintv:你误会了......它可以是删除或默认或用户定义的。您引用的文本仅使用 "defined as defaulted* 作为隐式定义的复制构造函数行为的简写。

标签: c++ constructor default-constructor


【解决方案1】:
struct A
{ 
  ~A(){ };
   A();
};

A::A(){ }; //here you can define default constructor

int main()
{
 A a;
}

你已经定义了显式析构函数而不是构造函数,添加构造函数声明并将其定义为外部类

【讨论】:

    【解决方案2】:

    您不能定义编译器隐式声明的构造函数。

    来自 C++ 标准(12 个特殊成员函数)

    1. ...程序不应定义隐式声明的特殊成员函数

    【讨论】:

    • 这对我来说并不明显。默认构造函数意味着它是在实现声明时定义的。由于不推荐使用这种情况,因此不必将构造函数标记为默认值,因此我可以自己提供定义。
    • 啊,关于您的最新编辑... 那么将隐式定义的成员函数标记为 defaulted 有什么意义呢?
    • @Dmitry Fucintv 所有类成员都应在类定义中定义,编译器特殊成员函数隐式声明的除外。如果你没有声明一个成员,那么你不能将它定义为类外的成员。
    • 如果隐式成员函数声明为默认值,我不应该担心,我应该吗?
    • @Dmitry Fucintv 例如,当您声明带参数的构造函数时,编译器不会隐式声明默认构造函数。
    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2022-08-15
    • 1970-01-01
    • 2017-09-27
    • 2015-10-18
    • 2015-08-26
    • 2016-12-28
    相关资源
    最近更新 更多