2012-05-10 192 views
7

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

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的&ÿ:: x',不能使用默认赋值运算符“。不应该复制ctor足够?

回答

19

vector元素必须是可分配的。从部分23.2.4类模板矢量C++标准的

...the stored object shall meet the requirements of Assignable.

+2

+1用于引用标准:) – Nobody

4

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

您最好使用shared_ptrboost::std::,具体取决于您的环境)还是原始指针。

1

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

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

0

通常禁止在任何容器中使用引用。您可以通过以下事实来证明这一点:例如,一个向量可以正向分配数据,而引用可以只分配一次(在初始化过程中)。

11

您可能要检查

std::reference_wrapper 

可提供C++ 11

+1

或者我相信'boost :: reference_wrapper' for pre C++ 11 – Nick

+0

这是一个很有用的答案,但是它会从一些解释/例子中得到很大的好处:std :: reference_wrapper '做和如何使用它。 – luator

-1

我终于用

std::vector< const Type* > 

有点不好看,但做同样的工作。

相关问题