c++ 对向量的列表初始化

dsf9zpds  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(151)

注意事项:请不要因为问题的根源是逗号运算符而关闭问题。问题的价值在于让社区了解以下问题的失败:

std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};

字符串
是因为逗号运算符
我正在列表初始化一个包含整数对的向量。
我理解以下工作如预期:

std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};
std::vector<std::pair<int, int>> vpairs_second{{0, 1}, {0, -1}};

的数据
但是,有人能解释一下为什么下面的方法不起作用吗?

std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};

wgeznvg7

wgeznvg71#

当谈到你关于pairs向量的列表初始化的问题时,你注意到了这里的不同行为,这真的很酷。
你的前两个例子是正确的。在第一种情况下,你使用std::make_pair显式创建对,这是在C++11之前创建对对象的标准方法,它仍然工作得很好:

std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};

字符串
在第二种情况下,你使用了C++11中引入的统一初始化,这也是完全有效的,而且更简洁:

std::vector<std::pair<int, int>> vpairs_second{{0, 1}, {0, -1}};


现在,到了棘手的部分!第三个例子有点棘手。你使用圆括号()而不是大括号{},在圆括号内,你有用逗号分隔的表达式:

std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};


在C++中,当你用这样的逗号分隔表达式时,它实际上是在使用逗号运算符,它计算它的两个操作数并返回第二个操作数的结果。所以(0,1)的值为1,(0,-1)的值为-1。你实际上想做的是这样的:

std::vector<int> some_vector{1, -1};


但这不是你想要的,因为vpairs_third应该是一个pairs向量,而不是int。所以编译器会感到困惑,并给你一个错误,因为你试图用int初始化一个pairs向量。
坚持使用大括号{}进行列表初始化,以避免逗号运算符的混淆,你会很好的。继续尝试C++,这是学习语言的一个很好的方法!

相关问题