You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何std::vector<std::pair<int,int>>的第三种列表初始化方式失效?

为什么std::vector<std::pair<int, int>> vpairs_third{(0, 1), (0, -1)};无法正常工作?

核心问题出在逗号运算符的解析上,而非列表初始化本身:

在C++中,(0, 1)这种带括号的写法会被编译器解析为逗号表达式,而不是你预期的std::pair初始化器。逗号表达式的执行逻辑是:先计算左侧表达式(这里是0)并丢弃结果,再计算右侧表达式(这里是1),最终整个表达式的结果就是右侧的值。

这意味着你的代码实际等价于:

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

显然,单个int值无法直接初始化std::pair<int, int>,因此编译器会报错。

两种正确写法的原理

  • 写法一:使用std::make_pair
std::vector<std::pair<int, int>> vpairs_first{std::make_pair(0, 1), std::make_pair(0, -1)};

std::make_pair(0,1)会直接构造出一个std::pair<int,int>对象,vector的列表初始化会将这些现成的pair对象依次加入容器,完全符合类型要求。

  • 写法二:使用双层大括号的聚合初始化
std::vector<std::pair<int, int>> vpairs_second{{0, 1}, {0, -1}};

std::pair属于聚合类型,{0,1}是合法的聚合初始化语法,直接用来构造std::pair<int,int>;外层的大括号则负责vector的列表初始化,将每个内层大括号构造的pair对象加入容器,语法完全合法。

内容的提问来源于stack exchange,提问作者cpp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:57:01