Why main can not be a constexpr?

c++, c++11, constexpr, language-lawyer, program-entry-point

Solution

No, this is not allowed the draft C++ standard in section `3.6.1` Main function paragraph 3 says:

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

`main` has to be a run-time function and as Lightness says it makes no sense since you can't optimize `main` away.

Problem

When you attempt to use constexpr with `main` like this: ``` constexpr int main() ``` gcc and clang complain: error: cannot declare '::main' to be inline error: 'main' is not allowed to be declared constexpr Let's see what requirements for constexpr function are: A constexpr function must satisfy the following requirements: - it must not be virtual - its return type must be LiteralType - each of its parameters must be literal type What is LiteralType? A literal type is any of the following - void(since c++14) - scalar type - reference type - an array of literal type What must the function body include? - null statements - static_assert declarations - typedef declarations and alias declarations that do not define classes or enumerations - using declarations - using directives - exactly one return statement that contains only literal values, constexpr variables and functions. The following examples: ``` constexpr int main() { ; } constexpr int main() { return 42; } constexpr int main() { // main defaults to return 0 } ``` seems to fit all these requirements. Also with that, `main` is special function that runs at start of program before everything else. You can run constexpr functions from main, and in order for something marked constexpr to be constexpr, it must be run in a constexpr context. So why is `main` not allowed to be a constexpr?

Original source