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

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

Изменено 14.07.2017 12:11 prezident.mira

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

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


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


J>Хотелось бы увидеть обоснование этому утверждению.


Обоснование крайне простое: я не знаю, где стандарт явно гарантирует, что тип выражения с вызовом функции совпадает с типом возвращаемого значения функции.
Но зато я знаю место в стандарте, где это не так. Т.е. про выражение, состоящего из вызова функции с возвращаемым типом T&, говорится, что тип у выражения T.

PM>>AST dump можно посмотреть онлайн https://godbolt.org/g/mAbnmj.

PM>>Про object написано: 'class TOnlyMovable' lvalue.
PM>>Про std::move(object): 'class TOnlyMovable' xvalue

J>Это детали реализации конкретного компилятора, не более того.


Как минимум его поведение здесь не противоречит вышеупомянутому мной месту в стандарте. И вообще clang старается крайне строго следовать стандарту.

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

PM>>Только типа TOnlyMovable

J>объясни тогда, плиз, единички вот здесь: https://ideone.com/BLvcmc


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

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


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


J>Хотелось бы увидеть обоснование этому утверждению.


Обоснование крайне простое: я не знаю, где стандарт явно гарантирует, что тип выражения с вызовом функции совпадает с типом возвращаемого значения функции.
Но зато я знаю место в стандарте, где это не так. Т.е. про выражение, состоящего из вызова функции с возвращаемым типом T&, говорится, что тип у выражения T.

PM>>AST dump можно посмотреть онлайн https://godbolt.org/g/mAbnmj.

PM>>Про object написано: 'class TOnlyMovable' lvalue.
PM>>Про std::move(object): 'class TOnlyMovable' xvalue

J>Это детали реализации конкретного компилятора, не более того.


Как минимум его поведение здесь не противоречит вышеупомянутому мной месту в стандарте. И вообще clang старается крайне строго следовать стандарту.

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

PM>>Только типа TOnlyMovable

J>объясни тогда, плиз, единички вот здесь: https://ideone.com/BLvcmc


Как понимать "тогда"?