操作员[]中的完美转发

问题描述 投票:1回答:1
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[] - 是否正确

c++ c++11 move-semantics perfect-forwarding
1个回答
2
投票

不,这种用法是不正确的。你想要的是把你的 key 值作为转发引用,就像这样。

template <typename T>
const Resource& operator[](T&& key) const;

然后,你可以完美地转发 key. 这可能会让人感到困惑,但我们来看看为什么要这样做。说 Key = int. 什么?operator[] 当我们实例化模板时是什么样子的?

const Resource& operator[](int&& key) const;

请注意,我们在这里使用的是 r-value 引用,而不是转发引用。你想要的是一个转发引用,由于模板演绎和引用折叠,它在实例化时评估为适当的类型。

然而,在你的例子中,完美转发的价值已经丧失,因为你只有一个 get 函数,它接受一个常量引用。在这种情况下,我认为除了一个常量引用之外,什么都没有。operator[] 是有用的。

© www.soinside.com 2019 - 2024. All rights reserved.