Re[4]: КОгда выбирается move-constructor?
От: jazzer Россия Skype: enerjazzer
Дата: 14.07.17 08:07
Оценка:
Здравствуйте, prezident.mira, Вы писали:

PM>Здравствуйте, jazzer, Вы писали:


NI>>>
void foo(TOnlyMovable&& object) {
NI>>>    TOnlyMovable m(std::move(object));
NI>>>}


J>>А зачем здесь std::move? object ведь уже rvalue-ref


PM>rvalue-ref это тип, а не категория значения rvalue.


Я и не говорил, что это категория.

PM>А вот подвыражение std::move(object) уже является xvalue типа TOnlyMovable и биндится к rvalue-reference.


std::move(object) возвращает rvalue reference:
template< class T > constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

PM>P.S. прежде чем писать мне сообщения (или лепить минусы) про то, что типом будет не TOnlyMovable, а TOnlyMovable&& — почитайте стандарт или хотя бы на дамп AST в clang посмотрите внимательно.


У меня сейчас нет под рукой ни стандарта, ни компилятора.
Вот вижу такое на http://en.cppreference.com/w/cpp/language/value_category:

Even if the variable's type is rvalue reference, the expression consisting of its name is an lvalue expression

может и наврали, конечно.

А если не наврали, то получается, что object — это lvalue типа TOnlyMovable&&, а std::move(object) это xvalue того же самого типа TOnlyMovable&&.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.