我有这个代码。 scores
是HiscoreTable
std::vector<reference_wrapper<Record>>
中的字段
void HiscoreTable::replaceRecord(Record rec)
{
bool found = false;
for (reference_wrapper<Record> r : scores) {
if (r.get().name == rec.name) {
r = rec;
found = true;
break;
}
}
if (!found) {
scores.push_back(rec);
}
}
如果我尝试for(reference_wrapper<Record> r : scores) cout << r.get() << endl;
,则会抛出bad_alloc。是因为r
不是Record&
而是reference_wrapper<Record>
,因此我无法为其分配Record
吗?我认为reference_wrapper<Record>::operator=
超载以允许这样的事情?
编辑:原来这是我的析构函数中的一个问题,打印循环所在的位置。在某些时候,我通过值将一个HiscoreTable传递给一个辅助函数,当它在辅助函数结束时被破坏时,它使调用点的HiscoreTable无效。我不知道为什么打印会破坏参考,但我想这就是发生的事情。
答案 0 :(得分:1)
对于初学者,您正在创建对本地对象的引用。
void HiscoreTable::replaceRecord(Record rec) { // 'rec' passed by value.
bool found = false;
for (reference_wrapper<Record> r : scores) {
if (r.get().name == rec.name) {
r = rec; // Reference to local object 'rec'.
/* ... */
} // 'rec' is destroyed and any reference to it will become dangling.
std::reference_wrapper
的赋值运算符会将内部“引用”替换为作为参数传递的引用,例如
r = rec; // Reference wrapper 'r' will contain pointer to 'rec'.
而是通过引用传递rec
。另外,对于替换粘贴,您需要更改r
- 循环中for
的类型作为参考。否则您将分配到本地副本。
for (reference_wrapper<Record>& r : scores) { // Type changed to reference.
/* ... */
}