当您尝试将constexpr与main
一起使用时:
constexpr int main()
gcc和clang抱怨:
错误:无法声明':: main'为内联
错误:'main'不允许声明为constexpr
让我们看看constexpr功能的要求是什么:
constexpr函数必须满足以下要求:
什么是LiteralType?
文字类型是以下任何一种
职能机构必须包括哪些内容?
以下示例:
constexpr int main() { ; }
constexpr int main() { return 42; }
constexpr int main() {
// main defaults to return 0
}
似乎符合所有这些要求。同样,main
是一个特殊的函数,它在程序开始之前运行。您可以从main运行constexpr函数,并且为了将constexpr标记为constexpr,它必须在constexpr上下文中运行。
那么为什么不允许main
成为constexpr?
答案 0 :(得分:35)
不,这不允许3.6.1
主要功能段 3 中的draft C++ standard说:
[...]将main定义为已删除或声明main为inline,static或constexpr的程序格式错误。[...]
main
必须是一个运行时函数,因为Lightness says没有意义,因为你无法优化main
。
答案 1 :(得分:24)
标准为main
提供了精确的签名,因此允许编译器拒绝其他签名。更具体地说,它规定main
不能是constexpr
,static
或其他一些东西。
如果您想知道为什么,则允许编译器在main
的开头插入代码(以执行初始化全局变量等操作),这可能使其成为非 - constexpr
(这就是为什么不允许程序明确调用main)。
答案 2 :(得分:15)
将main声明为constexpr
有两个原因没有任何意义:1)它是一个运行时函数。 2)可能无法从其他函数或递归调用它。
答案 3 :(得分:1)
在我看来,原因是将main()
声明为constexpr
并且标准委员会希望C ++编程语言有意义是没有意义的。
函数main()
是一个处理程序入口点初始化的特殊函数 - 用它来计算编译时值是不明智的。