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?
文字类型是以下任何一种
功能主体必须包括什么?
以下示例:
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.
use*_*411 25
该标准给出了精确的签名main,因此允许编译器拒绝其他签名.更具体地说,它规定,main不能constexpr,static或者一些其他的东西.
如果你想知道为什么,编译器被允许在开头插入代码main(做初始化全局变量之类的事情等),这可能使它成为非constexpr(这就是为什么例如程序不允许明确调用main ).
Vla*_*cow 16
声明main是没有任何意义的,constexpr原因有两个:1)它是一个运行时函数.2)可能无法从其他函数或递归调用它.