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的内置构造函数:
- 首先确定目标参数类型:你调用的是
vector<vector<int>>的push_back方法,它的合法重载只有两个:- 接收
const vector<int>&(左值常量引用)的重载 - 接收
vector<int>&&(右值引用)的重载
没有任何接收数组、int指针类型的重载,编译器直接排除将{22,33}转换为数组的可能,就算转换为数组也无法匹配参数要求。
- 接收
- 初始化列表的隐式构造:
{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
相关产品推荐
相关产品推荐

