首页 > 解决方案 > 带有引用的对象的 STL 容器

问题描述

考虑以下代码:

class C
{
public:
    C(int &a):_a(a){}
private:
    int &_a;
};

由于对 _a 的引用,该对象不能作为值包含在 STL 容器中。由于此引用,无法将默认构造函数添加到此类。

有没有办法让这个对象适合 STL 容器而不更改对指针的引用?

理想情况下,我想我想使用某种 std::reference_wrapper ,但我不能,因为它本身不是默认可构造的。

标签: c++stl

解决方案


有没有办法让这个对象适合 STL 容器

当然:

std::vector<C> name_of_vector {
    some_int, another_int, ...
};

请注意,隐式生成的赋值运算符的C语义如果被重新分配,可能会产生意想不到的后果std::vector<C>。即,赋值运算符修改引用的整数。

我强烈建议将赋值运算符定义为已删除。更好的是,完全避免使用引用成员。

理想情况下,我想我想使用某种 std::reference_wrapper

由于它的赋值语义(它重新绑定而不是修改引用的对象),这可能是一个更合理的选择。

但我不能,因为它本身不是默认可构造的。

默认可构造性不是任何标准容器的元素的要求(尽管它是某些标准容器的某些成员函数的要求,因此仅限于不使用这些)。


推荐阅读