【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 的类型。模板参数推导失败,导致编译错误。

浙公网安备 33010602011771号