提问者:小点点

使用初始值设定项列表作为值时,插入到std::list<std::vector<int>>失败?


我有一个像这样的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时,根本没有插入。 虽然我知道在使用C++的初始值列表时有很多微妙之处,但我想知道这个例子中的问题是什么?

谢啦!


共2个答案

匿名用户

的重载解决方案

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

调用将解析(形式上,根据[over.ics.rank]/3.1选择为最佳可行函数)到以下std::list<>>::insert重载[提取自std::list<>>::insertat cppreference,强调mine]:

iterator insert( const_iterator pos, std::initializer_list<T> ilist );

在pos之前插入初始值设定项列表ilist中的元素。

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

同样,您可以在列表初始化中使用嵌套列表初始化调用相同的insert重载,

lv.insert(lv.end(), {{}});  // Size is not 2.

以便最内部的列表初始化将解析为(根据[over.match.list]/1)std::vectorstd::initializer_list构造函数:

vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );

在此过程中,向std::vector对象中插入一个类型为std::list的元素,特别是一个空的向量。

匿名用户

当您调用push_back时,{}参数被推断为列表的元素类型,因此单个向量被插入到列表中。

当您调用insert时,您正在使用初始值设定项列表重载,并且由于初始值设定项列表为空,因此没有元素被添加到列表中。