为什么主要不能成为constexpr?

Tor*_*ter 20 c++ program-entry-point language-lawyer constexpr c++11

当您尝试使用constexpr时,main如下所示:

constexpr int main()
Run Code Online (Sandbox Code Playgroud)

gcc和clang抱怨:

错误:无法声明':: main'为内联

错误:'main'不允许声明为constexpr

让我们看看constexpr函数的要求是什么:

constexpr函数必须满足以下要求:

  • 它不能是虚拟的
  • 它的返回类型必须是LiteralType
  • 它的每个参数必须是文字类型

什么是LiteralType?

文字类型是以下任何一种

  • void(因为c ++ 14)
  • 标量类型
  • 参考类型
  • 一个文字类型的数组

功能主体必须包括什么?

  • 空语句
  • static_assert声明
  • typedef声明和不定义类或枚举的别名声明
  • 使用声明
  • 使用指令
  • 正好一个只包含文字值,constexpr变量和函数的return语句.

以下示例:

constexpr int main() { ; }

constexpr int main() { return 42; }

constexpr int main() {
// main defaults to return 0 
}
Run Code Online (Sandbox Code Playgroud)

似乎符合所有这些要求.还有这个,main是在程序开始之前运行的特殊功能.您可以从main运行constexpr函数,并且为了将constexpr标记为constexpr,它必须在constexpr上下文中运行.

那么为什么main不允许成为constexpr?

Sha*_*our 36

不,这不允许主要功能3段中的草案C++标准说:3.6.1

[...]将main定义为已删除或声明main为inline,static或constexpr的程序格式不正确.[...]

main必须是一个运行时功能,因为Lightness说没有意义,因为你无法优化main.

  • @ratchetfreak:哦?`static int foo = computationThatTakesThreeWeeks(); int main(){}` (12认同)
  • @ToryWebster因为将`main`声明为constexpr是完全没有意义的. (8认同)
  • @ToryWebster如果main是no-op,那么你可能根本不创建一个可执行文件 (3认同)
  • 但我的问题是为什么? (2认同)

use*_*411 25

该标准给出了精确的签名main,因此允许编译器拒绝其他签名.更具体地说,它规定,main不能constexpr,static或者一些其他的东西.

如果你想知道为什么,编译器被允许在开头插入代码main(做初始化全局变量之类的事情等),这可能使它成为非constexpr(这就是为什么例如程序不允许明确调用main ).

  • 通常,这些东西不会发生在`main`中,而是在实现中定义调用`main`的入口点.所以这不太正确. (4认同)
  • @ user3175411:这是可能的.真的,允许它是没有意义的.你无法在编译时优化`main`. (3认同)

Vla*_*cow 16

声明main是没有任何意义的,constexpr原因有两个:1)它是一个运行时函数.2)可能无法从其他函数或递归调用它.

  • +1我不明白为什么这有两个downvotes. (2认同)