与const成员对的向量

时间:2019-03-18 09:46:57

标签: c++ vector language-lawyer

this answer中所述,std::vector<T>不能包含const T或具有const成员的类。但是,T = std::pair<const int, int>并非如此,如下所示。为什么会这样呢? std::pair有何特别之处?

#include <utility>
#include <vector>

struct foo
{
    const int first;
    int second;
};

int main() {
    std::vector<std::pair<const int, int>> V1;
    V1.resize(3); // This compiles

    std::vector<foo> V2;
    V2.resize(3); // This gives the error listed below
}
  

错误:使用已删除的函数'foo :: foo()'

     

注意:'foo :: foo()'被隐式删除,因为默认定义格式不正确:

1 个答案:

答案 0 :(得分:18)

您在这里混淆了两件事。您收到的错误是由于std::vector::resize(size_type count)调用的隐式删除的foo()默认构造函数造成的:

  

如果当前大小小于count
  1)附加了其他默认插入的元素

std::pair模板具有默认构造函数,这就是对V1.resize的调用成功的原因。如果您也为foo提供了一个,或者通过类初始化允许其隐式生成,例如

struct foo
{
    const int first = 42;
    int second = 43;
};

然后

std::vector<foo> V2;
V2.resize(3);

将很高兴进行编译。对于std::pair<const int, int>foo都无法解决的操作是 assignment 。这不会编译:

V1[0] = std::pair<const int, int>(42, 43); // No way
V2[0] = { 42, 43 }; // Also not ok, can't assign to const data member

std::vector没有任何关系,但在两种情况下都与const合格的数据成员无关。