如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()'被隐式删除,因为默认定义格式不正确:
答案 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
合格的数据成员无关。