我有以下结构:
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}}时,它将无效。一连串的错误就会失败。
是因为我有引用作为我的对象的成员吗?
答案 0 :(得分:3)
由于它包含引用,因此您需要该类型的赋值和复制运算符。 STL容器对象必须是可复制的和可分配的(不幸的是,这不可能与您的引用一起使用)。
检查此主题:
它讨论了这个问题和一些替代解决方案,尽管它基本上说容器类型中没有引用成员。
答案 1 :(得分:2)
STL是基于价值的,并且与参考文献不相符。你可以进入a horrible tangle试图绕过这条规则。
将b
,p
,d
成员变为值或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库的客户时,它可能会突然停止工作。
无论你如何剪切它,更改引用都是未定义的行为。