繁体   English   中英

clang vs gcc中的空结构的默认初始化器

[英]Default Initializer of empty struct in clang vs gcc

以下代码使用GCC的某些版本和Clang的某些版本进行编译(请参见下面的版本)。

struct my_struct {};

int main(int argc, char** argv) {
  const my_struct my_object;
  return 0;
};

编译: g++ clang_error.cppclang++ clang_error.cpp 我在4.8.4上有g ++,在3.6.0上有clang ++。

错误消息是:

clang_error.cpp:7:19: error: default initialization of an object of const type 'const my_struct' without a user-provided default constructor
   const my_struct my_object;
                   ^
clang_error.cpp:7:28: note: add an explicit initializer to initialize 'my_object'
   const my_struct my_object;
                            ^
                             = {}
1 error generated.

受影响的版本

使用此处Compiler Explorer ,我可以看到GCC最高为4.5.4。 叮叮声最高影响到3.9.0。

我的问题是: C ++标准对此有何看法? 理想情况下,我会在意C ++ 14,但在那里我并不挑剔。

上面的示例代码是否符合标准?

我到目前为止发现的

我在C ++ 14的N3797草案中找到了以下内容。

第7.1.6.1条cv限定词[dcl.type.cv]
2 [注意:声明变量const会影响其链接(7.1.1)及其在常量表达式中的可用性(5.19)。 如8.5中所述,const限定类型的对象或子对象的定义必须指定一个初始化程序,或者接受默认初始化。 —尾注]

第8.5节
7要默认初始化类型T的对象,意味着:
—如果T是(可能是cv限定的)类类型(第9条),则调用T的默认构造函数(12.1)( 如果T没有默认构造函数或重载分辨率(13.3),则会导致初始化不正确 )从初始化上下文中删除或无法访问的歧义或函数中的歧义;
—如果T是数组类型,则每个元素都将默认初始化;
—否则,不执行初始化。

C ++标准对此有何说法?

上面的示例代码是否符合标准?

在C ++ 14中,它是不符合标准的:

n4431(2015)标准草案[dcl.init] / 7:

如果程序要求对const限定类型T的对象进行默认初始化,则T必须是具有用户提供的默认构造函数的类类型。

my_struct没有用户提供的默认构造函数,因此您不应默认初始化。

但是,某些较新的编译器似乎选择放宽该规则,可能是因为该规则受到缺陷报告的影响: DR 253


即将发布的标准已更改措辞:

当前(2017年)标准草案[dcl.init] / 7

如果T的默认初始化将调用用户提供的T的构造函数(不是从基类继承),或者如果T的默认初始化,则类类型T是const-default-constructible的

(7.4)T的每个直接非变量非静态数据成员M都有一个默认成员初始化器,或者,如果M是类类型X(或其数组),则X是const-default-constructible的,

(7.5)如果T是至少一个非静态数据成员的联合,则恰好一个变体成员具有默认成员初始化程序,

(7.6)如果T不是联合,则对于具有至少一个非静态数据成员(如果有)的每个匿名联合成员,恰好一个非静态数据成员具有默认成员初始化程序,并且

(7.7)T的每个可能构造的基类都是const-default-constructible。

如果程序要求对const限定类型T的对象进行默认初始化,则T应为const-default可构造的类类型或其数组。

这个措词对我来说有点模棱两可,但是我认为既然my_struct没有违反7.4的成员(并且不是联盟,所以7.5不适用,没有联盟成员,所以7.6不适用,没有基数,所以7.7确实如此)不适用),它是const-default-constructible的,因此该示例将是一致的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM