Неинициализированный constexpr допускается с помощью gcc - PullRequest
1 голос
/ 07 мая 2019

Учитывая код

int main()
{
    constexpr int n;
    return 0;
}

, g ++, с -fpermissive, выдает только предупреждение, в то время как clang ++, также с -fpermissive, выдает ошибки, жалуясь на инициализацию по умолчанию объекта константного типа'const int'.Теперь я считаю, что поведение clang ++ является правильным.Вопрос в том, что я что-то упустил или нет, и, возможно, g ++ не выдает ошибку, это приемлемо.Версии: clang ++ 7.0.1, g ++ 8.3.1, Fedora 29, amd64.

1 Ответ

2 голосов
/ 07 мая 2019

Стандарт в основном касается диагностики, а не ошибок или предупреждений. Таким образом, все, что требуется для создания соответствующего компилятора, - это диагностика, которую выполняют оба эти компилятора.

Относительно того, почему -fpermissive выдает только предупреждение в GCC в этом случае, но ошибка в Clang зависит от подхода, используемого этими компиляторами в отношении опции -fpermissive.

Согласно GCC :

-fpermissive

Понизить некоторую диагностику несоответствующего кода с ошибок до предупреждений. Таким образом, использование -fpermissive позволяет компилировать некоторый несоответствующий код.

У Clang сначала не было опции -fpermissive. Это было добавлено позже. Из информации, которую мы имеем в сети, подход Clang к этому варианту:

-fpermissive

Не выдавать ошибку при расширении языка. Диагностика неверного кода с использованием известного языковые расширения в текущем языковом режиме понижены до максимально предупреждение.

Таким образом, в Clang только языковые расширения понижены до статуса предупреждения. Если это не расширение языка (как в данном примере), оно не будет преобразовано в предупреждение и будет диагностировано как ошибка.

...