Обходные пути для отсутствующих ссылок на эту функцию
У меня есть прокси-контейнерный класс вокруг подвижного объекта, и я хочу, чтобы прокси-сервер мог неявно выдавать 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
).