【C++】嵌套容器添加`{}`初始化的元素时用`push_back`不要用`emplace_back`

嵌套容器添加{}初始化的元素时用push_back不要用emplace_back

std::vector<std::vector<int>> vec;

vec.push_back({1,2});		//正确
vec.emplace_back({1,2});	//报错

{1,2}实际是一个std::initializer_list<int>,由于 std::vector<int> 有一个接受 std::initializer_list<int> 的构造函数(非 explicit),编译器会利用这个构造函数隐式转换出一个临时的 std::vector<int> 对象,传给push_back(T& t)push_back(T&& t)

emplace_back的声明为template<class... Args> void emplace_back(Args&&... args);,它接受任意参数,并通过完美转发在容器内部直接构造元素,避免临时对象的产生。

但在模板参数推导阶段,{1,2} 是一个花括号初始化列表,它没有类型,因此编译器无法从 {1,2} 推导出 Args 的类型。模板参数推导失败,导致编译错误。

posted @ 2026-02-27 14:30  仰望星河Leon  阅读(9)  评论(0)    收藏  举报