包含引用的对象的向量

时间:2011-10-10 14:10:26

标签: c++ vector reference

我有以下结构:

struct Transaction {
    Transaction(Book& bb, Patron& pp, Date dd)
        : b(bb), p(pp), d(dd) { }
        Book& b;
        Patron& p
        Date d;
};

当我尝试将Transaction类型的对象放入带有vector<Transaction>v_t的{​​{1}}时,它将无效。一连串的错误就会失败。

是因为我有引用作为我的对象的成员吗?

4 个答案:

答案 0 :(得分:3)

由于它包含引用,因此您需要该类型的赋值和复制运算符。 STL容器对象必须是可复制的和可分配的(不幸的是,这不可能与您的引用一起使用)。

检查此主题:

http://cboard.cprogramming.com/cplusplus-programming/106779-copy-constructor-class-const-reference-member.html

它讨论了这个问题和一些替代解决方案,尽管它基本上说容器类型中没有引用成员。

答案 1 :(得分:2)

STL是基于价值的,并且与参考文献不相符。你可以进入a horrible tangle试图绕过这条规则。

bpd成员变为值或shared_ptr s。

答案 2 :(得分:0)

STL不能与引用一起使用,因为你不能有赋值操作符来指定引用(而不是副本) 你应该使用指针代替:

struct Transaction {
    Transaction(Book& bb, Patron& pp, Date dd)
        : b(&bb), p(&pp), d(dd) { }
        Book* b;
        Patron* p
        Date d;
};

答案 3 :(得分:0)

社区维基,因为这几乎肯定会调用UB。

如果您有复制构造函数,则可以使用placement new:

创建赋值运算符
struct Transaction {
  Transaction(Book& bb, Patron& pp, Date dd)
    : b(bb), p(pp), d(dd) { }

  Transaction(const Transaction & src)
    : b(src.b), p(src.p), d(src.d) { }

  Transaction & operator= (const Transaction & src) {
    if (this != &src) {
      this->~Transaction();
      Foo * copy = new (this) Transaction(src);
      return *copy;
    } else {
      return *this;
    }
  }

  Book& b;
  Patron& p
  Date d;

};

这可能适用于您的计算机,使用您的编译器,具有特定的优化设置。然后,它可能不会。或者,当操作员系统自动更新C ++ ABI库时,它可能会突然停止工作。或者,当您将其交付给具有略微不同版本的C ++ ABI库的客户时,它可能会突然停止工作。

无论你如何剪切它,更改引用都是未定义的行为。