我有一个像这样的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++的初始值列表时有很多微妙之处,但我想知道这个例子中的问题是什么?
谢啦!
的重载解决方案
lv.insert(lv.end(), {}); // Oops!
调用将解析(形式上,根据[over.ics.rank]/3.1选择为最佳可行函数)到以下std::list<>>::insert
重载[提取自std::list<>>::insert
at 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::vector
的std::initializer_list
构造函数:
vector( std::initializer_list<T> init,
const Allocator& alloc = Allocator() );
在此过程中,向std::vector
对象中插入一个类型为std::list
的元素,特别是一个空的向量。
当您调用push_back
时,{}
参数被推断为列表的元素类型,因此单个向量
被插入到列表中。
当您调用insert
时,您正在使用初始值设定项列表重载,并且由于初始值设定项列表为空,因此没有元素被添加到列表中。