Для начала у меня есть структура с одним значением со значением по умолчанию
struct S {
int a = 1;
};
Этот тип может быть сконфигурирован по умолчанию, если он не const/non-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{};
, особенно когда тип не является агрегатом.
Стандарт заставляет меня думать, что Кланг прав
N4296: 8.5/7
Если программа вызывает инициализацию по умолчанию объекта const-квалифицированный тип T, T должен быть типом класса с предоставленным пользователем конструктор по умолчанию
Итак, почему gcc разрешает это и S{};
не инициализируется по умолчанию, даже если тип не является POD или агрегатом?