template <typename Key, typename Resource>
class ResourceHolder {
std::unordered_map<Key, std::unique_ptr<Resource>> resources;
public:
Resource& get(const Key& key) const {
if (auto resource = resources.find(key); resource != std::end(resources)) {
return *(resource->second);
}
}
inline const Resource& operator[](Key&& key) const {
return get(std::forward<Key>(key));
}
};
我正在努力学习移动语义,我想知道我在使用 std::forward
里面 operator[]
- 是否正确
不,这种用法是不正确的。你想要的是把你的 key
值作为转发引用,就像这样。
template <typename T>
const Resource& operator[](T&& key) const;
然后,你可以完美地转发 key
. 这可能会让人感到困惑,但我们来看看为什么要这样做。说 Key = int
. 什么?operator[]
当我们实例化模板时是什么样子的?
const Resource& operator[](int&& key) const;
请注意,我们在这里使用的是 r-value 引用,而不是转发引用。你想要的是一个转发引用,由于模板演绎和引用折叠,它在实例化时评估为适当的类型。
然而,在你的例子中,完美转发的价值已经丧失,因为你只有一个 get
函数,它接受一个常量引用。在这种情况下,我认为除了一个常量引用之外,什么都没有。operator[]
是有用的。