Подтвердить что ты не робот

GCC принимает `constexpr struct {} s;`, но Clang отклоняет его. Кто прав?

Следующий код компилируется в GCC:

constexpr struct {} s;

Но Кланг отклоняет его со следующей ошибкой:

error: инициализация по умолчанию объекта const type 'const struct (anonymous struct at...)' без предоставленного пользователем конструктора по умолчанию

Я тестировал все версии GCC и Clang, которые я смог найти в https://gcc.godbolt.org/. Каждая версия GCC принимает код, и каждая версия Clang отклоняет его.

Интересно, какой компилятор прав в этом случае?
Что говорит об этом стандарт?

4b9b3361

Ответ 1

Кланг придерживается следующего отрывка в [dcl.init]/7:

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

Эта формулировка дефектная и поэтому игнорируется GCC (и, начиная с версии 3.9, также Clang).
Вышеуказанная цитата отличается от основной проблемы 253 из-за N2762 перемещения/настройки пункта 9, как указано.