N3936 [basic.start.main]
2
实现不应预定义main
函数。这个 功能不得超载。它应具有声明的返回类型 类型int
,但其类型是实现定义的。一个 实施应允许两者-
的函数()
返回int
和- 返回
的函数(int
char
,指向int
的指针)
N3337 [basic.start.main]
2
实现不应预定义main
函数。这个 功能不得超载。它应具有返回类型int
,但其他类型是实现定义的。所有 实现应允许以下两个定义main
:int main() { /* ... */ }
和
int main(int argc, char* argv[]) { /* ... */ }
是什么解释了这一变化?我能找到的最接近的是DR 1669,其中提议的措辞已包含此更改。我们知道由于"数组到指针衰减",char* argv[]
变为char** argv
。
std::cout << std::is_same<char**, std::decay<char*[]>::type>::value; // true
这并不需要重新措辞 - 这是不言自明的。那么为什么要改变?
答案 0 :(得分:5)
它通常更灵活,因为它不会限制语法 引入更改的DR为#1003:
这样的定义
main
的定义形式的规范 在C99中要求接受是明确的 参数名称和类型的确切语法形式可以有所不同。 虽然假设C ++实现会这样做是合理的 接受像int main(int foo, char** bar) { /* ... */ }
而不是规范
int main(int argc, char* argv[]) { /* ... */ }
使用类似的措辞澄清意图可能是个好主意 C99的。
上面提到了最常见的例子:
int main(int argc, char** argv)
这不是保证根据C ++ 11工作。
另一个例子是trailing-return-types。考虑到许多人现在只使用它们 - 并按照
的方式写一些东西auto main() -> int
我们希望这些和类似的定义是标准的。没有实现定义。