根据 C++11 标准,以下程序是否格式良好且可移植的 C++?
int main(int argc, char const* const* argv) {}
不。在纯可移植 C++ 程序中,argv
参数(如果存在)没有const
修饰符。
编辑:请参阅 C++11 草案标准的第 3.6.1.2 节,其中(在我之前的版本中)指出:
实现不应预定义主要功能。该功能不得重载。它应该有一个 int 类型的返回类型,否则它的类型是实现定义的。所有实现都应允许以下两种 main 定义:
int main(){ /*...*/ }
和
int main(int argc, char* argv[]) { /* ... */ }
取决于您所说的便携式。一个邪恶的 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 *
因此,虽然符合标准的实现在技术上可能会拒绝它,但我认为它可以移植到您可能希望使用的任何实现中。