Идеальная пересылка в операторе [] - PullRequest
1 голос
/ 25 мая 2020
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[] - это правильно?

1 Ответ

2 голосов
/ 25 мая 2020

Нет, это неправильное использование. Вы хотите использовать значение key в качестве ссылки для пересылки, например:

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

Затем вы можете идеально пересылать key. Это может сбивать с толку, но давайте посмотрим, почему это необходимо. Скажите Key = int. Как operator[] выглядит, когда мы создаем экземпляр шаблона?

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

Обратите внимание, что здесь мы берем ссылку на r-значение, а не ссылку пересылки. Вам нужна ссылка на переадресацию, которая из-за вывода шаблона и сворачивания ссылок оценивается как правильный тип при создании экземпляра.

Однако в вашем примере значение идеальной пересылки теряется, поскольку у вас есть только один get функция, которая принимает константную ссылку. В этом случае я не думаю, что что-либо, кроме ссылки на константу operator[], полезно.

...