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

J>Здравствуйте, N. I., Вы писали:


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


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


rvalue-ref это тип, а не категория значения rvalue.
В строке
TOnlyMovable m(std::move(object))
подвыражение object является lvalue типа TOnlyMovable, поэтому move-constructor вызван быть не может, если написать
TOnlyMovable m(object)
т.к. тип у параметра move-constructor-а это rvalue-reference, которое к lvalue не биндится.

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

P.S. прежде чем писать мне сообщения (или лепить минусы) про то, что типом будет не TOnlyMovable, а TOnlyMovable&& — почитайте стандарт или хотя бы на дамп AST в clang посмотрите внимательно.
Отредактировано 14.07.2017 7:07 prezident.mira . Предыдущая версия . Еще …
Отредактировано 14.07.2017 7:01 prezident.mira . Предыдущая версия .
Отредактировано 14.07.2017 7:00 prezident.mira . Предыдущая версия .
Отредактировано 14.07.2017 6:59 prezident.mira . Предыдущая версия .
Отредактировано 14.07.2017 6:57 prezident.mira . Предыдущая версия .
Отредактировано 14.07.2017 6:52 prezident.mira . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.