Почему gcc разрешает объект const без объявленного пользователем конструктора по умолчанию, но не clang?

Недавно Почему объект const требует пользовательский конструктор по умолчанию? был отмечен дубликат Почему C ++ требует, чтобы пользовательский конструктор по умолчанию устанавливал по умолчанию объект const? , Я использую coliru и rextexter для тестирования различных версий gcc (g ++ – 4.7, g ++ – 4.8, g ++ – 4.9) и clang (3.4 и 3.5), чтобы узнать, было ли это поведение введено в новых версиях компилятора , Здесь у нас есть два тестовых примера, взятых из обоих вопросов:

class A { public: void f() {} }; int main() { A a; // OK const A b; // ERROR af(); return 0; } 

а также:

 struct B{ B():x(42){} int doSomeStuff() const{return x;} int x; }; struct A{ A(){}//other than "because the standard says so", why is this line required? B b;//not required for this example, just to illustrate //how this situation isn't totally useless }; int main(){ const A a; } 

clang ошибки с:

  error: default initialization of an object of const type 'const A' requires a user-provided default constructor A const a; ^ 

ожидаемый, но не gcc, и MSVC тоже. Я думал, что, возможно, я схожу с ума, потому что в стандартных цитатах ясно сказано:

§ 8.5

6 Для инициализации объекта типа T по умолчанию:

– если T – тип classа (возможно, cv-qualified) (раздел 9), вызывается конструктор по умолчанию для T (и инициализация плохо сформирована, если T не имеет доступного конструктора по умолчанию);

[…]

Если программа вызывает инициализацию по умолчанию объекта с типом const, T, то T должен быть типом classа с предоставленным пользователем конструктором по умолчанию.

11 Если для объекта не задан инициализатор, объект инициализируется по умолчанию; […]

Язык, не содержащий POD, присутствующий во втором вопросе, кажется, отсутствует в n3337, поэтому, возможно, мне не хватает чего-то, что могло измениться. Это ошибка, дубликат или я что-то упускаю?

Спецификация в настоящее время требует пользовательских конструкторов по умолчанию, но, похоже, GCC реализует изменение на основе DR 253, в котором говорится, что если бы все под-объекты были инициализированы без предоставленного пользователем конструктора по умолчанию, тогда предоставленный пользователем конструктор по умолчанию не требуется.

Это изменение является только черновым статусом, еще не принятым и не является частью стандарта. Поэтому я думаю, что это поведение, предназначенное разработчиками GCC, но я не уверен, что это соответствующее расширение.

Ниже приведен пример первого примера, который вызывает ошибку GCC:

 class A { public: void f() {} int i; }; int main() { A a; // OK const A b; // ERROR af(); return 0; } 

Обратите внимание, что gcc понижает ошибку до предупреждения с помощью флага -fpermissive.

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=42844