13

它只是我的编译器还是禁止在 std::vector 元素中使用 cons 引用。考虑以下结构:

struct Y
{
  const int & x;

  Y(const int & p_x):
        x(p_x)
  {
  }
};

现在,当我尝试将此类对象推到向量上时:

std::vector<Y> yv;
int x = 5;
Y y(x);
yv.push_back(y);

我得到编译器错误:“错误:非静态引用成员 `const int&Y::x',不能使用默认赋值运算符”。复制 ctor 还不够吗?

4

6 回答 6

21

vector元素必须是可分配的。从C++ 标准的第23.2.4 节类模板向量:

...存储的对象应满足Assignable的要求。

于 2012-05-10T09:25:03.440 回答
12

你可能想检查

std::reference_wrapper

可用于 C++11

于 2012-05-10T09:26:52.370 回答
5

不,因为您不能分配给 const 引用,并且 STL 容器利用分配来移动项目。

您最好使用shared_ptrboost::std::取决于您的环境)或原始指针。

于 2012-05-10T09:22:56.957 回答
1

赋值运算符是必要的,因为vector默认会提前在额外的插槽中构造元素。

后来,它不是重新分配,而是使用赋值运算符将这些默认实例分配给您推入向量中的任何内容。

于 2012-05-10T09:23:20.970 回答
0

一般禁止在任何容器中使用引用。您可以通过以下事实来证明这一点,例如,向量分配正手数据,并且引用只能分配一次(在初始化期间)。

于 2012-05-10T09:23:58.573 回答
0

我终于用了

 std::vector< const Type* >

不是最好看的,但它做同样的工作。

于 2017-04-06T20:51:59.053 回答