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

2 p*_*ive 3 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() { /* ...  */ }
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char* argv[]) { /* ...  */ }
Run Code Online (Sandbox Code Playgroud)

是什么解释了这种变化 我能找到的最接近的是DR 1669,其中提议的措辞已包含此更改.我们知道由于"阵列到指针的衰减",char* argv[]这就变成了char** argv.

std::cout << std::is_same<char**, std::decay<char*[]>::type>::value; // true
Run Code Online (Sandbox Code Playgroud)

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

Col*_*mbo 5

它通常更灵活,因为它不会限制语法.
引入更改的DR是#1003:

main在C99中,要求接受的实现的定义形式的规范是明确的,参数名称和类型的确切语法形式可以变化.虽然可以合理地假设C++实现会接受类似的定义

int main(int foo, char** bar) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

而不是规范

int main(int argc, char* argv[]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

使用类似于C99的措辞澄清意图可能是个好主意.

最常见的例子如上所述:

int main(int argc, char** argv)
Run Code Online (Sandbox Code Playgroud)

这不能保证根据C++ 11工作.

另一个例子是trailing-return-types.考虑到现在很多人都专门使用它们 - 并且写下了类似的东西

auto main() -> int
Run Code Online (Sandbox Code Playgroud)

我们希望这些和类似的定义是标准的.不是实现定义的.

  • 就个人而言,我不会使用尾随的返回类型,他们不会给我任何东西.但这看起来就是原因. (5认同)
  • 鉴于`auto main() - > int`和`int main()`是等价的,并且旧的措辞已被广泛认可为打算允许等效定义(特别是`char**argv`),我不这样做认为这个答案真的解释了它. (2认同)
  • @Columbo对你的DR的引用是你的答案所缺少的,并且它清除了它:这不是因为旧的措辞不允许`char**argv`,而是从旧的措辞中不清楚`char**argv`被允许了.你的回答声称旧的措辞不允许等同的声明.我声称新的措辞只是澄清了旧措辞的含义. (2认同)