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
:Run Code Online (Sandbox Code Playgroud)int main() { /* ... */ }
和
Run Code Online (Sandbox Code Playgroud)int main(int argc, char* argv[]) { /* ... */ }
是什么解释了这种变化 我能找到的最接近的是DR 1669,其中提议的措辞已包含此更改.我们知道由于"阵列到指针的衰减",char* argv[]
这就变成了char** argv
.
std::cout << std::is_same<char**, std::decay<char*[]>::type>::value; // true
Run Code Online (Sandbox Code Playgroud)
这并不需要重新措辞 - 这是不言自明的.为什么要改变呢?
它通常更灵活,因为它不会限制语法.
引入更改的DR是#1003:
main
在C99中,要求接受的实现的定义形式的规范是明确的,参数名称和类型的确切语法形式可以变化.虽然可以合理地假设C++实现会接受类似的定义Run Code Online (Sandbox Code Playgroud)int main(int foo, char** bar) { /* ... */ }
而不是规范
Run Code Online (Sandbox Code Playgroud)int main(int argc, char* argv[]) { /* ... */ }
使用类似于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)
我们希望这些和类似的定义是标准的.不是实现定义的.
归档时间: |
|
查看次数: |
135 次 |
最近记录: |