Сообщение 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
Какие конкретно?
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
Как понимать "тогда"?
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
Как понимать "тогда"?