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

Ye *_*ang 8 c++ stl c++11

我有一个 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?
Run Code Online (Sandbox Code Playgroud)

如您所见,当{}用于创建 default 时std::vector<int>,插入根本没有发生。虽然我知道在使用 C++ 的初始化列表时有很多微妙之处,但我想知道这个例子中的问题是什么?

谢谢!

dfr*_*fri 6

过载分辨率

lv.insert(lv.end(), {});  // Oops!
Run Code Online (Sandbox Code Playgroud)

call 将解析(正式地,根据[over.ics.rank]/3.1选择为最佳可行函数)到以下重载 [从cppreference 中提取,重点是我的]:std::list<>::insertstd::list<>::insert

iterator insert( const_iterator pos, std::initializer_list<T> ilist );
Run Code Online (Sandbox Code Playgroud)

在 pos 之前插入初始化列表ilist 中的元素。

但作为初始化列表是空的,没有任何元素,从它被插入。


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

lv.insert(lv.end(), {{}});  // Size is now 2.
Run Code Online (Sandbox Code Playgroud)

这样最里面的列表初始化将解析为(根据[over.match.list]/1)的std::initializer_list构造函数std::vector

vector( std::initializer_list<T> init,
        const Allocator& alloc = Allocator() );
Run Code Online (Sandbox Code Playgroud)

因此,将 type 的单个元素(std::vector<int>特别是一个空的此类向量)插入到std::list<std::vector<int>>对象中。