You need to enable JavaScript to run this app. C++ 二维vector调用push_back时花括号初始化列表的类型识别与临时对象问题
优惠活动
大模型
产品
解决方案
定价
更多

C++ 二维vector调用push_back时花括号初始化列表的类型识别与临时对象问题

问题相关示例代码

vector<vector<int>> output; // 2D int vector

// 常规写法
vector<int> v = { 44, 55 };
output.push_back(v);

// 简化写法
output.push_back({ 22, 33 });

问题1:编译器如何判定{22,33}的类型

这个语法是C++11及以上标准支持的特性,编译器的判定逻辑基于重载决议规则和std::vector的内置构造函数:

  1. 首先确定目标参数类型:你调用的是vector<vector<int>>的push_back方法,它的合法重载只有两个:
    • 接收const vector<int>&(左值常量引用)的重载
    • 接收vector<int>&&(右值引用)的重载
      没有任何接收数组、int指针类型的重载,编译器直接排除将{22,33}转换为数组的可能,就算转换为数组也无法匹配参数要求。
  2. 初始化列表的隐式构造:{22,33}属于无显式类型的花括号初始化列表,当传递给需要明确类型的参数时,编译器会检查目标类型的构造函数:vector<int>内置了接收std::initializer_list<int>类型的构造函数,因此会自动用这个初始化列表隐式构造出一个vector<int>实例,完美匹配push_back的参数要求。

问题2:{22,33}是否属于临时对象

  • 单独的{22,33}只是初始化器语法,本身没有类型,不属于任何对象。
  • 在这个调用场景下,它会被用来隐式构造一个vector<int>类型的临时右值对象,最终效果和你显式写output.push_back(vector<int>{22,33})完全等价。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 05:06:08