我有一个 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++ 的初始化列表时有很多微妙之处,但我想知道这个例子中的问题是什么?
谢谢!
过载分辨率
Run Code Online (Sandbox Code Playgroud)lv.insert(lv.end(), {}); // Oops!
call 将解析(正式地,根据[over.ics.rank]/3.1选择为最佳可行函数)到以下重载 [从cppreference 中提取,重点是我的]:std::list<>::insert
std::list<>::insert
Run Code Online (Sandbox Code Playgroud)iterator insert( const_iterator pos, std::initializer_list<T> ilist );
在 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
:
Run Code Online (Sandbox Code Playgroud)vector( std::initializer_list<T> init, const Allocator& alloc = Allocator() );
因此,将 type 的单个元素(std::vector<int>
特别是一个空的此类向量)插入到std::list<std::vector<int>>
对象中。