我有这个非常简单的代码:
constexpr int main()
{
return 0;
}
我从C ++ 11标准N3485了解到它是非法的:
函数main不得在程序中使用。 main的链接(3.5)是实现定义的。 将main定义为已删除或声明main为inline,static或 constexpr的程序格式不正确。 名称main不以其他方式保留。
当我使用gcc 4.7.2运行它时。它输出以下错误:
prog.cpp:1:20: error: cannot declare ‘::main’ to be inline
同时,如果我从函数体中删除return 0
,它会报告相同的错误,甚至不会发出有关main
中缺少return语句的警告。
这是gcc 4.7.2的错误吗?为什么constexpr
报告为inline
?第二种现象是否意味着可以不在main
中放置return语句或默认情况下是return 0
,即使我没有将return语句放入其中(我知道这是不好的做法)?
谢谢。
答案 0 :(得分:9)
main()
是唯一允许省略return
语句的值返回函数。流出main()
的末尾而不返回任何内容等同于返回0
(而对于其他函数,它是未定义的行为,请参阅6.6.3 / 2)。
根据C ++ 11标准的第3.6.1 / 5段:
return
中的main
语句具有离开main
功能的效果(使用自动销毁任何对象) 存储持续时间)并以返回值作为参数调用std::exit
。如果控制到达终点main
没有遇到return
语句,效果就是执行return 0;
关于inline
消息,constexpr
函数隐式inline
。根据C ++ 11标准的第7.1.5 / 2段(courtesy of Luc Danton):
[...]。
constexpr
函数和constexpr
构造函数是隐式的inline
(7.1.2)。