使用大括号和括号时调用的不同构造函数

Different constructor called when using braces and parens

我正在编写一个函数来处理命令行参数。

#include <vector>
#include <string>
#include <iterator>
#include <iostream>

void process(std::vector<std::string> args)
{
    std::copy(args.begin(), args.end(), std::ostream_iterator<std::string>{std::cout, "\n"});   //show the arguments
}
int main(int argc, char* argv[])
{
    //process((&argv[0], &argv[argc]));   //ERROR
    process({&argv[0], &argv[argc]});
}

我的问题是为什么括号版本不起作用。
我想用迭代器版本构造向量。我知道 std::initializer_list 会优先被选中,但这似乎不是这样,因为这里可以成功处理多个参数。

process((&argv[0], &argv[argc]));

您正在使用 the comma operator 真正做到

process(&argv[argc]);

这当然是错误的,因为您没有 process 函数重载,它接受一个指向 char 的指针(即 char**)。

编译器将大括号括起来的列表识别为 std::vector constructor 的可能变体(链接引用中列表中的编号 5)。