C++ 为什么主要声明的措辞在标准草案之间发生变化?

C++ 为什么主要声明的措辞在标准草案之间发生变化?,c++,language-lawyer,c++14,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() { /* ... */ }

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[]) { /* ...  */ }
这一变化的原因是什么?我能找到的最接近的措辞是,提议的措辞已经包括了这一变化。我们知道,由于“数组到指针衰减”,因此
char*argv[]
变为
char**argv

std::cout << std::is_same<char**, std::decay<char*[]>::type>::value; // true

std::cout一般来说更灵活,因为它不限制语法。
引入更改的DR是:

main
定义格式的说明 实现需要接受C99中明确的 参数名称和类型的确切语法形式可能会有所不同。 虽然假定C++实现是合理的 接受这样的定义

int main(int foo, char** bar) { /* ... */ }
而不是规范的

int main(int argc, char* argv[]) { /* ... */ }
使用类似于的措辞澄清意图可能是一个好主意 C99的

上面提到了最常见的例子:

int main(int argc, char** argv)
根据C++11,这不能保证工作正常

另一个例子是尾部返回类型。考虑到许多人现在只使用它们-并且写一些沿着

的文字。
auto main() -> int

我们希望这些以及类似的定义成为标准。未定义实现。

就我个人而言,我不会在不给我买任何东西的情况下使用尾随返回类型。但这似乎就是原因。考虑到
auto main()->int
int main()
是等效的,而且旧的措辞已经被广泛认为是为了允许等效的定义(
char**argv
),我认为这个答案并不能真正解释它。@hvd如果它被广泛认为是次优的措辞。。。这将是改变现状的完美理由。DR证实了我的推理。@Columbo提到DR是你的答案中缺少的东西,它澄清了这一点:这不是因为旧的措辞不允许
char**argv
,而是旧的措辞不清楚
char**argv
是否被允许。你的回答声称旧的措辞不允许同等声明。我声称新的措辞只是澄清了旧措辞的含义。@hvd:相关的新问题: