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

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

Изменено 14.07.2017 6:59 prezident.mira

Re[3]: КОгда выбирается move-constructor?
Здравствуйте, 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, а подвыражение std::move(object) уже является xvalue типа TOnlyMovable.
Re[3]: КОгда выбирается move-constructor?
Здравствуйте, 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.