Почему главный не может быть constexpr?
Когда вы пытаетесь использовать constexpr с main
следующим образом:
constexpr int main()
gcc и clang жалуются:
error: не может объявить ':: main' для inline
error: "main" не разрешено объявлять constexpr
Посмотрим, какие требования для функции constexpr:
Функция constexpr должна удовлетворять следующим требованиям:
- он не должен быть виртуальным
- его тип возврата должен быть LiteralType
- каждый из его параметров должен быть литеральным типом
Что такое LiteralType?
Литеральный тип - это любой из следующих
- void (поскольку С++ 14)
- скалярный тип
- ссылочный тип
- массив литералов типа
Что должен включать тело функции?
- Операторы null
- объявления static_assert
- объявления typedef и объявления псевдонима, которые не определяют классы или перечисления
- с использованием объявлений
- с использованием директив
- точно один оператор return, содержащий только литеральные значения, константы и функции constexpr.
Следующие примеры:
constexpr int main() { ; }
constexpr int main() { return 42; }
constexpr int main() {
// main defaults to return 0
}
похоже, соответствует всем этим требованиям. Кроме того, main
- это специальная функция, которая запускается при запуске программы перед всем остальным. Вы можете запускать функции constexpr из main, и для того, чтобы что-то помеченное constexpr было constexpr, оно должно запускаться в контексте constexpr.
Итак, почему main
не разрешено быть constexpr?
Ответы
Ответ 1
Нет, это не разрешено проект стандарта С++ в разделе 3.6.1
В главном пункте 3 функции говорится:
[...] Программа, которая определяет главную как удаленную или объявляет, что main является встроенным, статическим или constexpr, плохо сформирована. [...]
main
должна быть функцией времени выполнения, а Легкость говорит, это не имеет смысла, поскольку вы не можете оптимизировать main
.
Ответ 2
Стандарт дает точную подпись для main
, поэтому компилятору разрешено отклонять другие подписи. Более конкретно, он предписывает, что main
не может быть constexpr
, static
или некоторыми другими вещами.
Если вам интересно, почему компилятору разрешено вставлять код в начале main
(чтобы делать такие вещи, как инициализация глобальных переменных и т.д.), которые могли бы сделать его не constexpr
(вот почему программе не разрешается явно вызывать main).
Ответ 3
Не имеет смысла объявлять main как constexpr
по двум причинам: 1) Это функция времени выполнения. 2) он не может быть вызван из других функций или рекурсивно.
Ответ 4
По моему мнению, причина в том, что нет смысла объявлять main()
как constexpr
, а комитет по стандартам хочет, чтобы язык программирования С++ имел смысл.
Функция main()
- это специальная функция, которая имеет дело с инициализацией начальной точки программы - нецелесообразно использовать ее для вычисления значений времени компиляции.