GCC 接受 `constexpr struct {} s;` 但 Clang 拒绝它。谁是正确的? [重复]

问题描述 投票:0回答:1

以下代码可以使用 GCC 正常编译:

constexpr struct {} s;

但是 Clang 拒绝了它,并出现以下错误:

错误:默认初始化 const 类型“const struct (anonymous struct at ...)”对象,而没有用户提供的默认构造函数

我已经测试了在 https://gcc.godbolt.org/ 找到的所有版本的 GCC 和 Clang。每个版本的 GCC 都接受该代码,每个版本的 Clang 都拒绝它。

我想知道在这种情况下哪个编译器是正确的?
标准对此有何规定?

c++ gcc clang language-lawyer constexpr
1个回答
41
投票

Clang 遵循 [dcl.init]/7 中的以下段落:

如果程序调用 const 限定类型的对象的默认初始化

T
,则
T
应是具有用户提供的默认构造函数的类类型。

此措辞有缺陷,因此被 GCC 忽略(并且,从 v3.9 开始,也被 Clang 忽略)。
上述引文与核心问题 253 不同,因为N2762移动/调整了引用的第 9 段。

© www.soinside.com 2019 - 2024. All rights reserved.