当您尝试将constexpr与main
一起使用时:
constexpr int main()
GCC和Clang抱怨:
错误:无法声明':: main'将是inline
错误:不允许'MAIN'声明constexpr
让我们看看constexpr函数的要求是:
constexpr函数必须满足以下要求:
- 它一定不能是虚拟的
- 其返回类型必须是文字型
- 其每个参数必须是字面类型
什么是文字?
字面类型是以下任何一种
- void(自C 14)
- 标量类型
- 参考类型
- 一系列字面类型
功能体必须包括什么?
- null语句
- static_assert声明
- 未定义类或枚举的Typedef声明和别名声明
- 使用声明
- 使用指令
- 正是一个仅包含文字值,constexpr变量和函数的返回语句。
以下示例:
constexpr int main() { ; }
constexpr int main() { return 42; }
constexpr int main() {
// main defaults to return 0
}
似乎符合所有这些要求。此外,main
是特殊功能,在程序的开头运行。您可以从main运行constexpr函数,为了使标记为constexpr成为constexpr的东西,必须在constexpr上下文中运行。
那么,为什么不允许main
成为Constexpr?
no,不允许在3.6.1
主函数中的C 标准草案段落 3 说:
[...]将main定义为已删除或声明为hinline,static或constexpr的程序是不形成的。[...]
main
必须是一个运行时函数,正如Lightness所说的那样,这是没有意义的,因为您无法优化main
。
标准给出了main
的精确签名,因此允许编译器拒绝其他签名。更具体地说,它规定了main
不能是constexpr
,static
或其他一些东西。
如果您想知道为什么,允许编译器在main
的开头插入代码(做诸如初始化全局变量等),这可能使其成为非constexpr
(它这就是为什么不允许程序明确拨打主的原因)。
,将main声明为 constexpr
没有任何意义,原因有两个:1)这是一个运行时函数。2)可能不会从其他功能或递归中调用它。
在我看来,将main()
声明为constexpr
是没有意义的,标准委员会希望C 编程语言有意义。
函数main()
是一个特殊功能,用于处理程序入口点初始化 - 使用它来计算编译时值是不明智的。