Обходные пути для отсутствующих ссылок на эту функцию

У меня есть прокси-контейнерный класс вокруг подвижного объекта, и я хочу, чтобы прокси-сервер мог неявно выдавать rvalue-ссылку на базовый объект, но только когда сам прокси перемещается.

Я верю, что смогу реализовать это поведение согласно предложению n2439 "Расширение семантики перемещения до * this", но оно еще не доступно в выпуске gcc и не будет в течение некоторого времени.

Код ниже - это то, к чему я в конечном итоге стремлюсь, но в настоящее время это невозможно. Пока эта функция не доступна для меня, есть ли эквивалентные обходные пути?

template< class T >
struct movable_proxy {
    operator T&&() && {
        return std::move(value);
    }

    operator const T&() const& {
        return value;
    }

private:
    T value;
};

1 ответ

Решение

Хороший вопрос. Недавно я попытался написать аналогичный класс прокси, но так и не нашел хорошего решения. Лучшее, что я обнаружил, это вызов функции-члена при каждом использовании, где прокси должен был иметь значение r:

ORef<T> move() {
    return ORef<T>( this->release() );
}

Это меняет семантику объявления чего-либо как значения r из std::move(proxy) в proxy.move(), но также допускает возможность возврата объекта другого типа (неявно преобразуемого в требуемый тип).

Моя практика кодирования с использованием этого состояла в том, чтобы всегда передавать прокси-объекты как значения, которые вынуждали указывать семантику вручную (перемещение, общая ссылка, копирование или что-то еще), но это, конечно, делает ошибки использования потенциальной проблемой (например, вызов x.move() до окончательного использования x).

Другие вопросы по тегам