【发布时间】:2015-06-23 08:54:11
【问题描述】:
首先,我有一个结构,它有一个值和一个默认值
struct S {
int a = 1;
};
当 gcc 和 clang 都是 non-const / non-constexpr 时,可以默认构造此类型。在两者之下,std::is_pod<S>::value 是 false。奇怪的行为如下:
S s1; // works under both
const S s2{}; // works under both
const S s3; // only works in gcc, clang wants a user-provided constructor
以下尝试都不会影响 clang:
struct S {
int a = 1;
constexpr S() = default; // defaulted ctor
virtual void f() { } // virtual function, not an aggregate
private:
int b = 2; // private member, really not an aggregate
};
我唯一能做的就是明确添加constexpr S() { }。 const S s; 失败而 const S s{}; 对我来说似乎真的错了,尤其是当类型不是聚合时。
标准让我觉得 Clang 是对的
N4296: 8.5/7
如果一个程序调用一个对象的默认初始化 const 限定类型 T,T 应是具有用户提供的类类型 默认构造函数
那么为什么 gcc 允许这样做,并且 S{}; 不是默认初始化,即使类型不是 POD 或聚合?
【问题讨论】:
-
open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#253;
{}也是非聚合的值初始化。 -
@David 我认为
= default这里还有更多内容 -
我刚刚添加了对我标记为副本的问题的答案。这里的问题是原始措辞要求构造函数是“用户提供的”。更新后的措辞提供了“用户提供”要求的例外情况,这将允许您的用例进行编译。
= default不起作用的原因是因为标准将用户提供的定义为“如果函数是用户声明的并且在其第一次声明时没有显式默认或删除,则该函数是用户提供的。”
标签: c++ gcc clang language-lawyer c++14