为什么 std::vector::insert 是一个带有空初始化列表的无操作?

Dav*_*óth 2 c++ insert vector

在下面的代码中:

#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)

这是为什么?如果隐式转换失败,不应该出现编译错误吗?

joh*_*ohn 5

您的代码要求将初始化列表中尽可能多的项目惰性化到向量中。由于初始化列表中没有任何项目,因此不会插入任何内容。

我不确定您期望什么,也许您期望从初始化列表创建一个向量并插入该向量,即

v.insert(v.begin(),std::vector<int>{})
Run Code Online (Sandbox Code Playgroud)

但这不会发生,因为vector<T>::insert有一个initializer_list<T>直接需要 an 的重载(其行为如我上面描述的那样)。