在下面的代码中:
#include <iostream>
#include <vector>
int main()
{
std::cout<<"Hello World";
std::vector<std::vector<int>> v;
while(v.size() <= 2){
v.insert(v.begin(),{}); //1
std::cout << "!";
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
每次迭代的输出都变得越来越激进,因为尽管进行了操作v.size(),但输出从未增加insert。
但是,当initializer_list其中有元素或被临时元素替换时,循环会按预期运行多次。
...
v.insert(v.begin(),{0}); //1
...
Run Code Online (Sandbox Code Playgroud)
...
v.insert(v.begin(),std::vector<int>()); //1
...
Run Code Online (Sandbox Code Playgroud)
这是为什么?如果隐式转换失败,不应该出现编译错误吗?
您的代码要求将初始化列表中尽可能多的项目惰性化到向量中。由于初始化列表中没有任何项目,因此不会插入任何内容。
我不确定您期望什么,也许您期望从初始化列表创建一个向量并插入该向量,即
v.insert(v.begin(),std::vector<int>{})
Run Code Online (Sandbox Code Playgroud)
但这不会发生,因为vector<T>::insert有一个initializer_list<T>直接需要 an 的重载(其行为如我上面描述的那样)。