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


У меня есть класс контейнера прокси вокруг подвижного объекта и я хочу, чтобы прокси мог неявно давать ссылку 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 67

1 ответ:

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

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

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

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