2014-02-03 7 views
19

При попытке использовать constexpr с main как это:Почему главный не может быть constexpr?

constexpr int main() 

НКУ и лязг жалуются:

error: cannot declare '::main' to be inline

error: 'main' is not allowed to be declared constexpr

Давайте посмотрим, какие требования к функции constexpr являются:

Функция constexpr должна удовлетворять следующие требования:

  • он не должен быть виртуальным
  • его тип возвращаемого значения должен быть LiteralType
  • каждый из его параметров должны быть буквальным типа

Что такое LiteralType?

Литерал типа любые из следующего

  • пустоты (так как C++ 14)
  • скалярного типа
  • ссылочного типа
  • массива буквального типа

Что должен включать тело функции?

  • нулевые заявления
  • static_assert декларация
  • декларации TYPEDEF и декларация псевдонимов, которые не определяют классы или перечисления
  • с помощью деклараций
  • с помощью директивы
  • точно один оператор возврата, который содержит только буквенные значения , 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?

+15

Мне кажется, что существует одержимость некоторыми людьми использовать новые языковые возможности ** везде **, независимо от того, имеет ли это смысл. –

+0

Будет ли это функция, необходимая для того, чтобы избавиться от 'fork' и' exec', чтобы просто выполнить '/ bin/false'? –

+4

Также argc и argv никогда не могут быть известны во время компиляции. – StackedCrooked

ответ

34

Нет, это не допускается в разделе 3.6.1Основные функции пунктdraft C++ standard говорит:

[...]A program that defines main as deleted or that declares main to be inline, static, or constexpr is ill-formed.[...]

main должен быть функцией времени выполнения и, как Lightness says это не имеет смысла, так как вам не может оптимизировать main.

+2

Но почему мой вопрос? –

+8

@ToryWebster Поскольку нет смысла объявлять 'main' как constexpr. – Paranaix

+0

Я задаю один и тот же вопрос. Я спрашиваю user3175411: «Но как насчет C++ 14 смягченных ограничений constexpr? Будет ли constexpr main быть действительным в будущем, если компилятор вставляет коды, соответствующие этим смягченным ограничениям?» –

24

Стандарт дает точную подпись для main, поэтому компилятору разрешено отклонять другие подписи. Более конкретно, он предписывает, что main не может быть constexpr, static или некоторыми другими вещами.

Если вам интересно, почему , компилятор имеет право вставить код в начале main (чтобы сделать такие вещи, как инициализировать глобальные переменные и т.д.), который мог бы сделать его не constexpr (именно поэтому, например, программе не разрешено явно вызывать функцию).

+0

Но как насчет C++ 14 ослабленных ограничений constexpr? Будет ли constexpr main быть действительным в будущем, если компилятор вставляет коды, соответствующие этим смягченным ограничениям? –

+0

@ToryWebster Я ожидаю, что нет. Это сделало бы для не переносимого кода, и я думаю, что стандарт не остановит явное запрещение 'constexpr'' main'. – user3175411

+4

Как правило, этот материал не встречается в 'main', но в реализации определяет точку входа, которая вызывает' main'. Так что это не совсем правильно. –

14

Это не имеет смысла объявлять основные как constexpr по двум причинам: 1) Это функция времени выполнения. 2) он не может быть вызван из других функций или рекурсивно.

+1

+1 (когда я получаю свежие голоса завтра): это то, что я собирался сказать, также. –

+0

+1 Я согласен с @LightnessRacesinOrbit. Я не вижу ничего фактического с этим ответом. –

+2

+1 Я не понимаю, почему это получило два downvotes. –

1

По моему мнению, причина в том, что нет смысла объявлять main() как constexpr, и комитет по стандартам хочет, чтобы язык программирования C++ имел смысл.

Функция main() - это специальная функция, которая имеет дело с инициализацией начальной точки программы - нецелесообразно использовать ее для вычисления значений времени компиляции.

Смежные вопросы