【问题标题】:A defaulted default constructor, why is it not a user-provided default constructor?一个默认的默认构造函数,为什么不是用户提供的默认构造函数?
【发布时间】:2016-10-22 18:13:01
【问题描述】:

例如clang不会编译这段代码,因为下面struct A的默认默认构造函数A() = default;不被认为是用户提供的。

struct A{ A() = default; };
const A a;

但如果您查看[dcl.fct.def.general]/1,您会看到:

函数体:
ctor-initializeropt复合语句
功能尝试块
= default ;
= delete ;

= default;是默认构造函数A::A()函数体,也就是说上面的定义A() = default;等价于A(){}为@987654335 @是默认构造函数的主体。

顺便说一句,g++ 编译了上面的 sn-p,但我知道 g++ 在这方面还有其他问题,根据 Jonathan Wakely 的this comment

【问题讨论】:

  • 奇怪,正如你所说,clang failsgcc compiles。 VS2015 也是如此。
  • 用户提供的明确默认的看起来像struct A{A();}; A::A()=default;

标签: c++ c++14 language-lawyer


【解决方案1】:

因为标准是这样说的 ([dcl.fct.def.default]/5):

一个函数是用户提供的如果它是用户声明的而不是 在第一次声明时显式默认或删除。

这样做可以让您使用= default; 维护琐碎属性。否则,没有办法给具有另一个构造函数的类一个微不足道的默认构造函数。

【讨论】:

  • 我认为您提供的报价中的“已删除”一词是不必要的,因为 [[dcl.fct.def.delete]/4](eel.is/c++draft/dcl.fct.def.delete#4) 已经禁止发生已删除的定义在函数的第一个声明之后。我在这里错过了什么吗?
  • @Alexander 使 A() = delete; 不是用户提供的。
  • 但至少在默认情况下,我们知道该函数要么是用户提供的,要么是由编译器隐式提供的。但是对于一个明确删除的函数,我很困惑,因为据我所知,这个函数从未定义过。定义这样一个永远不会被调用的函数的目的是什么?
  • @Alexander 我不明白你的问题。 = delete; 是一个定义。将 A() = delete; 归类为非用户提供并不意味着您可以自己定义。
猜你喜欢
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2019-06-13
  • 2014-05-18
  • 1970-01-01
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多