为什么初始化列表不能是main的参数?怎么建议呢?

Pap*_*ter 5 c++ standards program-entry-point initializer-list c++11

有效的C++ main签名如下:

int main()
int main(int argc, char *argv[])
int main(int argc, char **argv)
Run Code Online (Sandbox Code Playgroud)

但是不允许声明main获取初始化列表:

int main(std::initializer_list<char *> args)
Run Code Online (Sandbox Code Playgroud)

AFAIK初始化列表可以实现为一对指针或指针(可以是argv参数)加上一个长度(这可以从argc参数中推导出来),其存储可以是自动,临时或静态只读存储器视情况而定.

所以我认为一个std::initializer_list<char *>可以处理和管理没有任何问题的命令行参数,然后我想知道为什么这个假设的main签名没有在C++ 11标准的初始化列表批准后添加,因为我问:

  • 允许初始化列表作为main唯一参数的缺点或问题是什么?(我想不到任何事).
  • 哪个是向标准委员会提出此增加(或任何其他变更)的正确方法?

jxh*_*jxh 4

尽管在程序中有两种指定方法main(),但大多数(全部?)C++ 运行时的当前实现都以main()相同的方式调用该函数(它们传递参数,而(int, char *[])不管如何main()声明)。您的建议将要求所有实现的 C++ 运行时找出main()正在使用哪种类型的程序,并调用正确的main(). 如果您确实想要自己使用此功能,您始终可以提供一个实现,main(int, char *[])将参数转换为类似对象的初始值设定项列表(例如vector<>),然后调用您选择的新入口点函数。

标准 C++ 网站描述了提交提案的过程。基本步骤是: (1) 在他们的 Usenet 组/邮件列表中提出这个想法;(2)起草提案,征求反馈意见,并相应更新提案;(3) 重复该过程直至提案被接受。

  • @jxh:也许在某些实现上;甚至可能在所有现有的实现上。但我在标准中没有看到任何内容表明它们的调用方式相同。如果“main”的调用是普通函数调用,则这两种形式是不兼容的,并且当期望没有参数时使用两个参数调用“main”将具有未定义的行为。 (2认同)