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

Почему главный не может быть 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?

4b9b3361

Ответ 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() - это специальная функция, которая имеет дело с инициализацией начальной точки программы - нецелесообразно использовать ее для вычисления значений времени компиляции.