【发布时间】:2017-02-15 13:46:25
【问题描述】:
以下代码使用 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 有 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 here,我可以看到最高 4.5.4 的 GCC 受到影响。 Clang 在 3.9.0 之前受到影响。
问题
我的问题是:C++ 标准对此有何评论? 理想情况下,我会关心 C++14,但我对此并不挑剔。
上面的示例代码符合标准吗?
到目前为止我发现了什么
我在 C++14 的 Draft 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 是数组类型,则每个元素都是默认初始化的;
— 否则,不执行初始化。
【问题讨论】:
-
请推荐更好的标签。
-
看起来像 this 解释它。
-
那么新版本的 GCC 和 Clang 在标准方面被破坏了?当然,标准中必须有一条规则允许这些编译器的当前行为。您的链接答案虽然有用,但没有回答我这个问题。
-
你是对的,这是核心问题 253。GCC 在gcc.gnu.org/gcc-4.6/changes.html#cplusplus记录了它对 gcc 4.6 的行为变化@