Информация об изменениях

Сообщение Re[5]: КОгда выбирается move-constructor? от 14.07.2017 8:17

Изменено 14.07.2017 8:19 prezident.mira

Re[5]: КОгда выбирается move-constructor?
Здравствуйте, jazzer, Вы писали:

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


J>std::move(object) возвращает rvalue reference:

J>template< class T > constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

А я и не говорил, что тип возвращаемого значения std::move не ссылка
Но тип возвращаемого значения функции и тип [под]выражения, состоящего из вызова этой функции — это не одно и то же!!!

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


J>У меня сейчас нет под рукой ни стандарта, ни компилятора.


http://eel.is/c++draft/expr#5
If an expression initially has the type “reference to T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to T prior to any further analysis.

AST dump можно посмотреть онлайн https://godbolt.org/g/mAbnmj.
Про object написано: 'class TOnlyMovable' lvalue.
Про std::move(object): 'class TOnlyMovable' xvalue

J>Вот вижу такое на http://en.cppreference.com/w/cpp/language/value_category:

А я вот такое вижу там такое: Each expression has some non-reference type.

J>

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

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

J>А если не наврали, то получается, что object — это lvalue типа TOnlyMovable&&, а std::move(object) это xvalue того же самого типа TOnlyMovable&&.

Только типа TOnlyMovable
Re[5]: КОгда выбирается move-constructor?
Здравствуйте, jazzer, Вы писали:

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


J>std::move(object) возвращает rvalue reference:

J>template< class T > constexpr typename std::remove_reference<T>::type&& move( T&& t ) noexcept;

А я и не говорил, что тип возвращаемого значения std::move не ссылка
Но тип возвращаемого значения функции и тип [под]выражения, состоящего из вызова этой функции — это не одно и то же!!!

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


J>У меня сейчас нет под рукой ни стандарта, ни компилятора.


http://eel.is/c++draft/expr#5
If an expression initially has the type “reference to T” ([dcl.ref], [dcl.init.ref]), the type is adjusted to T prior to any further analysis.

AST dump можно посмотреть онлайн https://godbolt.org/g/mAbnmj.
Про object написано: 'class TOnlyMovable' lvalue.
Про std::move(object): 'class TOnlyMovable' xvalue

J>Вот вижу такое на http://en.cppreference.com/w/cpp/language/value_category:

А я вот вижу там такое: Each expression has some non-reference type.

J>

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

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

J>А если не наврали, то получается, что object — это lvalue типа TOnlyMovable&&, а std::move(object) это xvalue того же самого типа TOnlyMovable&&.

Только типа TOnlyMovable