Обходные пути для отсутствия ссылок 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 ответ:
хороший вопрос. Недавно я попытался написать подобный прокси-класс, но никогда не достиг хорошего решения. Лучшее, что я нашел, это вызов функции-члена при каждом использовании, где прокси должен был быть R-значением:
ORef<T> move() { return ORef<T>( this->release() ); }
это изменяет семантику объявления чего-то r-значение из
std::move(proxy)
toproxy.move()
, но также допускает возможность возврата объекта другого типа (неявно конвертируемого в требуемый тип).мои кодирования практика использования этого заключалась в том, чтобы всегда передавать прокси-объекты в качестве rvalues, которые заставляли ручную спецификацию семантики (перемещение, общая ссылка, копирование или что-то еще), но это, конечно, делает ошибки использования потенциальной проблемой (например, вызов
x.move()
до окончательного использованияx
).