使用大括号和括号时调用的不同构造函数
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)。
我正在编写一个函数来处理命令行参数。
#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)。