【问题标题】:STL container for objects with references [duplicate]具有引用的对象的 STL 容器 [重复]
【发布时间】:2021-03-18 19:58:29
【问题描述】:

考虑以下代码:

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

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

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

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

【问题讨论】:

标签: c++ stl


【解决方案1】:

这不起作用的原因是我试图使用 [] 运算符插入 unordered_map。

这就是编译器抱怨缺少默认构造函数的原因。

我只是忘记了 [] 的意思是“查找或创建”,它不像插入。 使用插入解决了问题

【讨论】:

    【解决方案2】:

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

    当然:

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

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多