gcc constexpr解释为内联?

时间:2013-05-23 16:29:20

标签: c++ c++11

我有这个非常简单的代码:

 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语句放入其中(我知道这是不好的做法)?

谢谢。

1 个答案:

答案 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)。