Подтвердить что ты не робот

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

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

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

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

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

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

private:
    T value;
};
4b9b3361

Ответ 1

Хороший вопрос. Недавно я попытался написать аналогичный класс прокси, но так и не получил хорошего решения. Лучшее, что я нашел, это вызвать функцию-член при каждом использовании, где прокси-сервер должен был быть r-значением:
ORef<T> move() {
    return ORef<T>( this->release() );
}

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

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