struct S {
int a = 1;
};
当它是非常量/非constexpr时,gcc和clang都可以默认构造此类型。在两者下,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:那么为什么gcc会允许这种情况,即使该类型不是POD或聚合体,如果程序要求使用const限定类型T的默认初始化对象,则T必须是具有用户提供的默认构造函数的类类型。
S{};
也不能进行默认初始化呢?
= default
的内容。 - Ryan Haining= default
不起作用的原因是标准将用户提供定义为“如果它是用户声明的并且在其第一次声明中未明确默认或删除,则函数是用户提供的”。 - David Stone