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

时间:2013-09-30 16:52:36

标签: c++ c++11 standards main initializer-list

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

int main()
int main(int argc, char *argv[])
int main(int argc, char **argv)

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

int main(std::initializer_list<char *> args)

AFAIK初始化列表可以实现为一对指针或指针(可以是argv参数)加上一个长度(这可以从argc参数推导出来),以及存储可以是自动,临时或静态只读存储器depending on the situation

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

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

3 个答案:

答案 0 :(得分:4)

虽然在程序中有两种指定main()的方法,但C ++运行时的大多数(全部?)当前实现都以相同的方式调用main()函数(它们将参数传递为{ {1}}无论(int, char *[])如何宣布)。您的提案需要所有实现的C ++运行时才能确定程序正在使用哪种main(),并调用正确的main()。如果你真的想要自己使用这个功能,你总是可以提供main()的实现,它将参数转换为像对象一样的初始化列表(例如main(int, char *[])),然后调用一个新的入口点函数你的选择。

Standard C++ website描述了提交提案的流程。基本步骤是:(1)将想法浮现在Usenet组/邮件列表中; (2)起草提案,征求反馈意见并相应更新提案; (3)重复该过程,直到该提案被接受为止。

答案 1 :(得分:4)

值得注意的是一个库(但不是标准的C ++库,根据3.6.1 [basic.start.main]第2段,第一句:“实现不应预定义main函数。” )可以定义函数main()并以合适的方式实现它,例如,调用app_main()

#include <initializer_list>
#include <string>
#include <vector>
extern int app_main(std::vector<std::string> const&);

int main(int ac, char* av[]) {
    return app_main(std::vector<std::string>(av, av + ac));
}

由于main()无法重载(根据3.6.1 [basic.start.main]第2段,第二句:“此函数不应重载。”)入口点需要不同的名称。由于std::initializer_list<T>除了使用{ ... }之外无法构建,因此需要使用与std::initializer_list<T>不同的类型。在此过程中,上述实现还选择将char*转换为std::string个对象。

要使用上述功能,应用程序只会实现app_main(),它将被调用:

#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
#include <cstdlib>

int app_main(std::vector<std::string> const& args) {
    std::cout << "received the arguments: ";
    std::copy(args.begin(), args.end(),
              std::ostream_iterator<std::string>(std::cout, " "));
    return EXIT_SUCCESS; // return statement can't be omitted, of course
}

答案 2 :(得分:0)

我认为这是由于C兼容性的考虑而不是技术原因。从C继承了很多东西。