为什么主要不能成为constexpr?

时间:2014-02-03 23:09:24

标签: c++ c++11 main language-lawyer constexpr

当您尝试将constexpr与main一起使用时:

constexpr int main()

gcc和clang抱怨:

  

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

     

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

让我们看看constexpr功能的要求是什么:

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

  • 一定不能虚拟
  • 其返回类型必须为LiteralType
  • 其每个参数必须是文字类型

什么是LiteralType?

文字类型是以下任何一种

  • void(自c ++ 14开始)
  • 标量类型
  • 参考类型
  • 一个文字类型数组

职能机构必须包括哪些内容?

  • null陈述
  • static_assert声明
  • 未定义类或枚举的typedef声明和别名声明
  • 使用声明
  • 使用指令
  • 只包含一个只包含文字值,constexpr变量和函数的return语句。

以下示例:

constexpr int main() { ; }

constexpr int main() { return 42; }

constexpr int main() {
// main defaults to return 0 
}

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

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

4 个答案:

答案 0 :(得分:35)

不,这不允许3.6.1 主要功能 3 中的draft C++ standard说:

  

[...]将main定义为已删除或声明main为inline,static或constexpr的程序格式错误。[...]

main必须是一个运行时函数,因为Lightness says没有意义,因为你无法优化main

答案 1 :(得分:24)

标准为main提供了精确的签名,因此允许编译器拒绝其他签名。更具体地说,它规定main不能是constexprstatic或其他一些东西。

如果您想知道为什么,则允许编译器在main的开头插入代码(以执行初始化全局变量等操作),这可能使其成为非 - constexpr(这就是为什么不允许程序明确调用main)。

答案 2 :(得分:15)

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

答案 3 :(得分:1)

在我看来,原因是将main()声明为constexpr并且标准委员会希望C ++编程语言有意义是没有意义的。

函数main()是一个处理程序入口点初始化的特殊函数 - 用它来计算编译时值是不明智的。