Сообщение Re[3]: КОгда выбирается move-constructor? от 14.07.2017 6:48
Изменено 14.07.2017 7:07 prezident.mira
Re[3]: КОгда выбирается move-constructor?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, N. I., Вы писали:
NI>>
J>А зачем здесь std::move? object ведь уже rvalue-ref
rvalue-ref это тип, а не категория значения rvalue.
В строке
А вот подвыражение std::move(object) уже является xvalue типа TOnlyMovable и биндится к rvalue-reference.
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.
Re[3]: КОгда выбирается move-constructor?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, N. I., Вы писали:
NI>>
J>А зачем здесь std::move? object ведь уже rvalue-ref
rvalue-ref это тип, а не категория значения rvalue.
В строке
А вот подвыражение std::move(object) уже является xvalue типа TOnlyMovable и биндится к rvalue-reference.
P.S. прежде чем писать мне сообщения (или лепить минусы) про то, что типом будет не TOnlyMovable, а TOnlyMovable&& — почитайте стандарт или хотя бы на дамп AST в clang посмотрите внимательно.
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 посмотрите внимательно.