Arhn - архитектура программирования

Неинициализированный constexpr разрешен с gcc

Учитывая код

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

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

07.05.2019

  • Предупреждение — это диагностика (все, что требуется по стандарту). Поэтому оба компилятора правы. 07.05.2019
  • -fpermissive обычно превращает ошибки в предупреждения. Это кажется контрпродуктивным для вопроса. 07.05.2019
  • Я понимаю, о чем вы говорите, но поскольку clang++ выдает ошибку даже с -fpermissive, я думаю, что один компилятор более мягок, чем другой, в этом отношении. И если я правильно читаю стандарт, это должно быть ошибкой. 07.05.2019
  • С помощью -fpermissive вы явно сообщаете компилятору, что хотите играть быстро и свободно с правилами стандарта. Вы не можете ожидать, что компилятор будет следовать правилам, если вы прямо скажете ему: «Эй, просто доверься мне; не следовать правилам 07.05.2019

Ответы:


1

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

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

Согласно GCC:

-fpermissive

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

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

-fpermissive

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

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

07.05.2019
Новые материалы

Коллекции публикаций по глубокому обучению
Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

Представляем: Pepita
Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

Советы по коду Laravel #2
1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

3 способа решить квадратное уравнение (3-й мой любимый) -
1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

Создание VR-миров с A-Frame
Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

Демистификация рекурсии
КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..