gpt4 book ai didi

c++ - 使用初始化列表作为值时,插入 std::list> 失败?

转载 作者:行者123 更新时间:2023-12-01 12:30:04 25 4
gpt4 key购买 nike

我有一个 C++ 片段,看起来像这样:

  std::list<std::vector<int>> lv;
lv.push_back({});
std::cout << lv.size() << std::endl; // "1"

lv.insert(lv.end(), {}); // Oops!
// lv.insert(lv.end(), std::vector<int>()); // OK
std::cout << lv.size() << std::endl; // Still got "1", but why?
如您所见,使用 {} 时创建默认 std::vector<int> ,插入根本没有发生。虽然我知道在使用 C++ 的初始化列表时有很多微妙之处,但我想知道这个例子中的问题是什么?
谢谢!

最佳答案

过载分辨率

lv.insert(lv.end(), {});  // Oops!

call 将解析(正式地,根据 [over.ics.rank]/3.1 被选为最佳可行函数)到以下 std::list<>::insert过载 [摘自 std::list<>::insert at cppreference , 重点 矿]:
iterator insert( const_iterator pos, std::initializer_list<T> ilist );

inserts elements from initializer list ilist before pos.


但是由于初始值设定项列表是空的,因此没有要插入的元素。

您也可以调用相同的 insert在列表初始化中使用嵌套列表初始化重载,
lv.insert(lv.end(), {{}});  // Size is now 2.
这样最里面的列表初始化将解析为(根据 [over.match.list]/1 ) std::initializer_list constructor of std::vector :
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );

因此插入类型为 std::vector<int> 的单个元素,特别是一个空的此类 vector ,进入 std::list<std::vector<int>>目的。

关于c++ - 使用初始化列表作为值时,插入 std::list<std::vector<int>> 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62557002/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com