它只是我的编译器还是禁止在std :: vector元素中使用cons引用。考虑以下结构:
struct Y
{
const int & x;
Y(const int & p_x):
x(p_x)
{
}
};
现在,当我尝试将这样的对象推送到vector:
std::vector<Y> yv;
int x = 5;
Y y(x);
yv.push_back(y);
我得到编译器错误:“错误:非静态引用成员`const int&amp; Y :: x',不能使用默认赋值运算符”。不应该复制ctor就够了吗?
答案 0 :(得分:20)
vector
元素必须是可分配的。来自C ++标准的 23.2.4类模板向量:
......存储的对象应满足Assignable的要求。
答案 1 :(得分:10)
您可以查看
std::reference_wrapper
可与C ++ 11一起使用
答案 2 :(得分:5)
不,因为您无法分配给const引用,并且STL容器使用赋值来移动项目。
您最好使用shared_ptr
(boost::
或std::
,具体取决于您的环境)或原始指针。
答案 3 :(得分:1)
赋值运算符是必要的,因为vector
默认提前在额外的时隙中构造元素。
稍后,它不使用重新分配,而是使用赋值运算符将这些默认实例分配给您向量中推送的任何内容。
答案 4 :(得分:0)
通常禁止在任何容器中使用引用。您可以通过以下事实来证明这一点:例如,向量分配正手数据,而引用只能分配一次(在初始化期间)。
答案 5 :(得分:0)
我终于使用了
std::vector< const Type* >
不是最好看的,但它做同样的工作。