C++ 为什么使用C++;是否未重载以使用std::string?

C++ 为什么使用C++;是否未重载以使用std::string?,c++,command-line-arguments,main,C++,Command Line Arguments,Main,我试图创建一个通过命令行使用main()函数参数的程序。作为(基本)C++程序员(即使我对C风格的指针和数组都很清楚),我几乎从来没有使用过代码> char */COD>字符串和C数组。我花了一些时间来获取main()参数,并将其转换为std::string。。。于是问自己:为什么C++中的主()>代码>函数没有重载以获取 STD::向量AGV而不是旧的代码> char *AGV[] /? 对于“重载”,我指的是main()函数如int main()和int main(int argc,char

我试图创建一个通过命令行使用
main()
函数参数的程序。作为(基本)C++程序员(即使我对C风格的指针和数组都很清楚),我几乎从来没有使用过代码> char */COD>字符串和C数组。我花了一些时间来获取
main()
参数,并将其转换为
std::string
。。。于是问自己:为什么C++中的<代码>主()>代码>函数没有重载以获取<代码> STD::向量AGV而不是旧的代码> char *AGV[] /<代码>? 对于“重载”,我指的是
main()
函数如
int main()
int main(int argc,char*argv[])
的共存,而不是程序员对正常函数的重载

<>为什么在C++中,主()函数不重载以获取 std::vector argv而不是旧的char*argv[]

因为这要求依赖于
库。C++的理念始终是“不要为你不使用的东西付费”。如果有人不想要
string
提供的自动内存管理,则无法强制执行。
第二视图:如果某个平台没有任何库支持,那么你不能启动你的C++程序!!p> 相反,
int
char**
参数是内置的独立类型。人们总是可以在
main()
上编写自定义包装器,它完全可以执行任何需要的操作

编辑:根据程序员的评论:

假设允许
main(vector)
;然后,如果一个平台符合所有C++特性,但没有标准库支持,那么它将变成非标准兼容。

基本上,STD::vector是不一样的(在内存布局或任何东西)作为一个字符数组*。要允许这样做,您必须让编译器识别新的主声明,并在创建字符串向量的条目上添加包装器

考虑到您正在这样做,您也可以扔掉argc,并声明main be

int main(std::vector<std::string> argv)
intmain(std::vector argv)
但这是编译器的工作。你必须让很多人认为这是值得的

否则你可以自己做

int main(int argc, char **argv)
{
    std::vector<std::string> args;
    args.reserve(argc);
    for (std::size_t arg = 0; arg < argc; ++arg)
    {
         args.push_back(argv[i]);
    }
    return mymain(args);
}
int main(int argc,char**argv)
{
std::向量args;
args.储量(argc);
对于(std::size\u t arg=0;arg
代码不能保证编译或工作,因为我只是在脑子里写下了它

或者(更好,多亏了编程人员)

int main(int argc,char**argv)
{
返回mymain(std::vector(argv,argv+argc));
}

为什么不在标准中?简单:

因为没有人提出

<> P>东西进入C++标准,因为有人写了一个提案,然后让其他人投票,并将其合并。除非有人真的希望它发生,否则它不会发生

考虑到这个功能实际上是多么微不足道:

int main(int argc, char **argv)
{
    std::vector<std::string> args(argv, argv + argc);
    ...
}
int main(int argc,char**argv)
{
标准::向量args(argv,argv+argc);
...
}

只是没有任何真正的需要。这是一个方便的函数,与另一个函数相比,它甚至没有使事情变得方便。

编译器编译定义为

int main(std::vector<std::string> args) {
    ...
}
intmain(std::vector args){
...
}
正如它被写为

int main(int __argc, char **__argv) {
    std::vector<std::string> args(__argv, __argv+__argc);
    ...
}
int main(int\uu argc,char**\uu argv){
std::向量args(uuargv,uuuargv+uuuargc);
...
}
允许任何容器,甚至自定义容器,而不仅仅是
std::vector
,都同样容易。
但是它不是标准的,因为这是标准中为什么没有的标准答案,没有人提出它,也没有人说服足够多的人相信这是一个好主意。我不认为这是一个提议,所以可能没有理由拒绝它。对于大多数相关人员来说,这种改变可能是简单的。

我怀疑,主要原因是通常的实现是 使用varargs将其设置为
extern“C”
函数。大量 实现时,调用main的是C运行时库

解决这个问题的方法有很多,但似乎没有一种值得费心,
考虑到将参数转换为所需的参数是多么容易

将内容填充到字符串向量中是非常简单的,但从字符串向量创建char*argv[]则不是。@Plasmah是的。为什么编译器不能添加此重载所需的单个ctor调用?@DavidRodríguez dribeas我知道
main()
用户不能重载。我的意思是语言上的“过度渲染”。我们已经有了两个标准版本的main。这是怎么复制的?imho应该重新打开“replicate”只询问main()是否重载(不是)。这个问题清楚地说明了事实,并询问了原因。一点也不重复,投票赞成重新开放。如果你使用哲学,允许
int-main(std::vector)
而不阻止
int-main(int,char**)
的可能性将如何打破薪酬?@AProgrammer:实际上,标准允许实现为
main
添加新的有效选项,只要它仍然允许标准中定义的两个选项,“第二视图”是假的。一个C++甚至没有实现向量和字符串的“实现”与C的一致性远,甚至不能运行很多简单、标准的符合性的、惯用的C++代码。同样,我们不应该使用C++来实现这个逻辑…或者C.@delnan:比这要复杂一点。有些编译器在出厂时没有标准库实现,您需要提供一个标准库实现。还有一些情况下,编译器附带了标准库的实现,但您不想使用它(在我的研讨会中,我们使用我们自己的经过调整的标准库,Elect也是如此)
int main(int __argc, char **__argv) {
    std::vector<std::string> args(__argv, __argv+__argc);
    ...
}