7

根据 C++11 标准,以下程序是否格式良好且可移植的 C++?

int main(int argc, char const* const* argv) {}
4

2 回答 2

12

不。在纯可移植 C++ 程序中,argv参数(如果存在)没有const修饰符。

编辑:请参阅 C++11 草案标准的第 3.6.1.2 节,其中(在我之前的版本中)指出:

实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:

int main(){ /*...*/ }

int main(int argc, char* argv[]) { /* ... */ }

于 2012-06-26T21:32:49.167 回答
3

取决于您所说的便携式。一个邪恶的 C++ 实现可能会拒绝它,理由是它的签名 ,int(int,char const*const*)与所需的允许签名之一不同,int()并且int(int,char**). (一个邪恶的实现可能看似拒绝auto main(int argc,char* argv[]) -> int,或者实际上拒绝任何main关于身体不在哪里的定义{ /* ... */ }

然而这并不典型。我不知道添加 const 会导致调用问题的任何实现,并且由于 C++11 添加了有关“相似”类型的位,因此在通过变量访问对象main时不会违反严格的别名规则。char**char const * const *

因此,虽然符合标准的实现在技术上可能会拒绝它,但我认为它可以移植到您可能希望使用的任何实现中。

于 2012-06-26T22:23:49.360 回答