C++ c++;插入空向量不能使用大括号

C++ c++;插入空向量不能使用大括号,c++,vector,std,C++,Vector,Std,下面的代码不能正常工作,当我引用it时,它会导致成员调用空指针错误,如果它不受支持,为什么它允许使用insert(end,{})(无编译错误) #包括 #包括 使用名称空间std; int main(){ 向量vv; autoit=vv.insert(vv.end(),{}); cout size()行autoit=vv.insert(vv.end(),{});正在使用表单 当int行auto it=vv.insert(vv.end(),{});时,初始化器列表没有元素,因此向量vv中没有插入元

下面的代码不能正常工作,当我引用
it
时,它会导致
成员调用空指针错误
,如果它不受支持,为什么它允许使用
insert(end,{})
(无编译错误)

#包括
#包括
使用名称空间std;
int main(){
向量vv;
autoit=vv.insert(vv.end(),{});

cout size()行
autoit=vv.insert(vv.end(),{});
正在使用表单

当int行
auto it=vv.insert(vv.end(),{});
时,初始化器列表没有元素,因此向量
vv
中没有插入元素

由于没有插入任何元素,因此
它与
vv.end()
相同,因此它对遵从无效

您可以在插入后通过检查
vv
的长度来验证它。请参阅以检查它。

根据,所有
insert()
风格返回第一个插入元素的迭代器,或者如果没有插入任何元素,则返回插入位置

在OPs暴露的MCVE中:

#include <vector>
#include <iostream>
using namespace std;
int main() {
    vector<vector<pair<int, int>>> vv;
    auto it = vv.insert(vv.end(), {});
    cout << it->size() << endl;
}
不使用
迭代器插入(常量迭代器位置、常量T和值)

正如预期的那样,但是
迭代器插入(const_iterator pos,std::initializer_list ilist);

因此,插入了0个元素,
insert()
返回传递的
end()
迭代器

所以

输出:

插入初始值设定项列表
0

注意:

我知道,至少,重载
std::vector
是一种糟糕的风格。
我做了这个,特别是显示了使用函数调用(我没有更好的想法如何实现这一点)。<编译>错误并不是说你认为它是什么东西。在C++中,你可以编写很多东西而不需要编译错误,它可以用来代替原来的代码>迭代器插入(conthyTyror POS,const t和value)。
。我现在明白了,因为他的答案比@cse早,而且你的repu比@cse高得多,所以我接受了他的答案。@BAKEZQ这是你的决定。;-)感谢你的详细解释。如果我在cppref中更仔细地检查,我会发现这一点。我从未检查过初始值设定项列表的详细信息,但大多数时候它都像我预期的那样工作,然而,这是我的我的直觉失败了。
auto it = vv.insert(vv.end(), {});
cout << it->size() << endl;
#include <initializer_list>
#include <iostream>
#include <vector>

template <typename T>
struct Container: std::vector<T> {
  using typename std::vector<T>::iterator;
  using typename std::vector<T>::const_iterator;
    
  iterator insert( const_iterator pos, const T& value )
  {
    std::cout << "insert single value\n";
    return std::vector<T>::insert(pos, value);
  }
  
  iterator insert( const_iterator pos, std::initializer_list<T> ilist )
  {
    std::cout << "insert initializer list\n";
    return std::vector<T>::insert(pos, ilist);
  }
};

using namespace std;
int main() {
    Container<vector<pair<int, int>>> vv;
    auto it = vv.insert(vv.end(), {});
    cout << /*it->*/vv.size() << endl;
}