根据C ++ 11标准,以下程序是否是格式良好且可移植的C ++?
int main(int argc, char const* const* argv) {}
答案 0 :(得分:12)
没有。在纯可移植C ++程序中,argv
参数(如果存在)没有const
修饰符。
编辑:请参阅C ++ 11草案标准的第3.6.1.2节,该标准(在我之前的版本中)声明:
实现不应预定义主函数。这个功能 不得超载。它应该具有int类型的返回类型,但是 否则其类型是实现定义的。所有实施 应允许以下两个主要定义:
int main(){ /*...*/ }
和
int main(int argc, char* argv[]) { /* ... */ }
答案 1 :(得分:3)
取决于便携式的含义。邪恶的C ++实现可以拒绝它,理由是它的签名int(int,char const*const*)
与所需的允许签名int()
和int(int,char**)
不同。 (一个邪恶的实施似乎拒绝auto main(int argc,char* argv[]) -> int
,或者实际上,main
身体不是{ /* ... */ }
的任何定义
然而,这不典型。我不知道添加const会导致调用main
的问题的任何实现,并且由于C ++ 11添加了关于“相似”类型的位,因此在访问{时不会违反严格别名规则{1}}通过char**
变量对象。
因此,虽然符合标准的实现可以在技术上拒绝它,但我认为它可以移植到您可能会使用的任何实现。