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