У меня есть класс контейнера прокси вокруг подвижного объекта, и я хочу, чтобы прокси мог неявно выдавать ссылку 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;
};
convert_proxy(p)
, который перегружен для rvalues и lvalues, чтобы вернуть либоT&&
, либоconst T&
.. . но это делает использование прокси непрозрачным, что, вероятно, не то, что вы хотите - person Jonathan Wakely   schedule 28.01.2013&&
и&
, что именно вам не хватает? - person Andy Prowl   schedule 28.01.2013T const&
, так и вT&&
, независимо от категории значения самого прокси. Я думаю, OP хочет, чтобыproxy&&
преобразовали вT&&
иproxy&
вT const&
. - person Nawaz   schedule 28.01.2013std::forward
, а неstd::move
? Последний всегда преобразуется в rvalue, даже если источник не был rvalue. И это помогает только в том случае, если прокси-объект явно перемещается / перенаправляется, а не если он просто возвращается как rvalue - person Jonathan Wakely   schedule 28.01.2013std::forward
вообще имеет смысл в этом контексте, еслиT
не является выводимым типом? - person Nawaz   schedule 28.01.2013x > 0
- person Jonathan Wakely   schedule 28.01.2013std::forward
не поможет там, где клиентский код вызываетstd::move(movable_proxy<T>&)
в ожидании ответаT&&
. Я думаю, что дляstd::forward
, чтобы вернуть соответствующую ссылкуmovable_proxy<T>
, т.е. перенаправить прокси в качестве прокси, было бы в общем уместно. - person boycy   schedule 28.01.2013namespace std
- извините, но я не думаю, что есть какой-либо способ прозрачно эмулировать ref-qualifiers. Клиенту нужно делать что-то, кроме простогоstd::move(o)
. - person Xeo   schedule 04.03.2013You can't partially specialize function template
Разве это ограничение не снято в C ++ 11? Это просто вопрос поддержки компилятора или я ошибаюсь? - person Lightness Races in Orbit   schedule 10.04.2013