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