2

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

 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从函数体中删除 ,它会报告相同的错误,甚至不会给出关于缺少 return 语句 from 的警告main

这是 gcc 4.7.2 的错误吗?为什么constexpr被报告为inline?第二种现象是否意味着不放入return语句main是可以的,还是默认情况下return 0即使我没有放入return语句(我知道这是不好的做法)?

谢谢你。

4

1 回答 1

9

main()是唯一允许return省略语句的返回值函数。在不返回任何内容的情况下从末尾流出main()等同于返回0(而对于其他函数,它是未定义的行为,请参阅 6.6.3/2)。

根据 C++11 标准的第 3.6.1/5 段:

returnin 语句具有main离开main函数(销毁具有自动存储持续时间的任何对象)并std::exit以返回值作为参数调用的效果。如果控制到达末尾main没有遇到return语句,效果就是执行

return 0;

关于inline消息,constexpr函数是隐式的inline。根据 C++11 标准的第 7.1.5/2 段(由 Luc Danton 提供):

[...]。constexpr函数和constexpr构造函数是隐式的 inline(7.1.2)。

于 2013-05-23T16:31:49.093 回答