为什么标准草案之间的主要变更声明的措辞?

时间:2014-12-08 21:14:26

标签: c++ language-lawyer c++14

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

这并不需要重新措辞 - 这是不言自明的。那么为什么要改变?

1 个答案:

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

我们希望这些和类似的定义是标准的。没有实现定义。