Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ clang vs gcc中空结构的默认初始值设定项_C++_G++_C++14_Clang++ - Fatal编程技术网

C++ clang vs gcc中空结构的默认初始值设定项

C++ clang vs gcc中空结构的默认初始值设定项,c++,g++,c++14,clang++,C++,G++,C++14,Clang++,下面的代码使用GCC的一些版本和Clang的一些版本编译,请参见下面的哪个版本 struct my_struct {}; int main(int argc, char** argv) { const my_struct my_object; return 0; }; 使用:g++clang_error.cpp和clang++clang_error.cpp编译。我在4.8.4和3.6.0版本中使用了g++和clang++ 错误消息是: clang_error.cpp:7:19: er

下面的代码使用GCC的一些版本和Clang的一些版本编译,请参见下面的哪个版本

struct my_struct {};

int main(int argc, char** argv) {
  const my_struct my_object;
  return 0;
};
使用:g++clang_error.cpp和clang++clang_error.cpp编译。我在4.8.4和3.6.0版本中使用了g++和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.
受影响的版本 使用编译器资源管理器,我可以看到4.5.4之前的GCC受到影响。叮当声最多可影响3.9.0

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

上述示例代码是否符合标准

到目前为止我发现了什么 我在C++14中发现了以下内容

§7.1.6.1 cv限定符[dcl.type.cv] 2[注:声明变量const可能会影响其链接7.1.1及其在常量表达式5.19中的可用性。 如8.5所述,常量限定类型的对象或子对象的定义必须指定初始值设定项 或进行默认初始化。-结束注释]

§8.5 7默认初始化T类型的对象意味着: -如果T是第9条中可能的cv限定类类型,则调用T的默认构造函数12.1并 如果T没有默认构造函数或重载解析13.3导致 在初始化上下文中被删除或无法访问的函数中出现歧义或错误; -如果T是数组类型,则每个元素默认初始化; -否则,不执行初始化

< C++标准对此有何看法?

上述示例代码是否符合标准

在C++14中,它是不一致的:

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

如果程序调用常量限定类型的对象的默认初始化 T , T 应为类类型 使用用户提供的默认构造函数

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

但是,一些较新的编译器似乎已选择放宽该规则,可能是因为它受到缺陷报告的约束:

即将出台的标准改变了措辞:

2017年现行标准草案:

如果T的默认初始化将调用不是从基类继承的用户提供的T构造函数,或者如果

7.4 T的每个直接非变量非静态数据成员M都有一个默认成员初始值设定项,或者,如果M是类类型X或其数组,则X是常量默认可构造

7.5如果T是至少有一个非静态数据成员的联合,则只有一个变量成员具有默认成员初始值设定项

7.6如果T不是联合,则对于至少有一个非静态数据成员(如有)的每个匿名联合成员,只有一个非静态数据成员具有默认成员初始值设定项,以及

7.7 T的每个潜在构造基类都是常量默认可构造的

如果程序调用常量限定类型T的对象的默认初始化,则T应为常量默认可构造类类型或其数组


措辞对我来说有点含糊不清,但我认为因为我的结构没有违反7.4的成员,也不是工会,所以7.5不适用,没有工会成员,所以7.6不适用,没有基础,所以7.7不适用,它是const default可构造的,因此示例将是一致的。

请建议更好的标记。看起来像是解释了它。那么,新版本的GCC和Clang在该标准方面被破坏了吗?当然,标准中必须有一条规则允许这些编译器的当前行为。你的链接答案虽然有用,但没有回答我这个问题。也许是答案。它链接到C++11标准委员会的问题。现在,只需要一个与标准的解决方案相关的链接。你是对的,这是核心问题253。GCC记录了GCC 4.6在