我正在玩 Move Semantics 和 [r|l]value 引用来学习如何在实际程序中使用它们。考虑以下代码:
// Item is a heavy class having move ctor and assignment but no copy.
std::map<std::string, Item*> lookup;
std::forward_list<Item> items;
void FooClass::addItem(Item&& d) {
if (lookup.find(d.getName()) == lookup.end()) {
lookup[d.getName()] = &d; //<== not safe after move?
items.push_front(std::move(d));
}
}
我正在获取地址Item&&
并将其存储在指针中。然后将数据移动到std::forward_list
( items
)。我假设调用移动赋值不会影响对象的地址。那是对的吗?虽然d
移动后的内容不再有效。即查找表 ( lookup
) 的内容不正确。
我假设我必须重新排序 a) 添加查找项和 b) 移动实际数据。上面的代码不理智。这个对吗?
我也不明白为什么我必须在std::move
那里说。编译器应该知道这d
是一个右值引用。所以它应该调用std::forward_list<T>::push_front(T&&)
并移动分配......