Когда вы пытаетесь использовать 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?