История изменений
Исправление DarkEld3r, (текущая версия) :
Опередили пока писал.
Можно про это поподробнее? Это по стандарту так?
По стандарту (12.8.31) дела обстоят следующим образом:
— in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function or catch-clause parameter) with the same cv- unqualified type as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function’s return value
— in a throw-expression...
— when a temporary class object that has not been bound to a reference (12.2) would be copied/moved to a class object with the same cv-unqualified type, the copy/move operation can be omitted by constructing the temporary object directly into the target of the omitted copy/move
— when the exception-declaration of an exception handler...
Я не то чтобы очень хороший толкователь стандарта, но в моём понимании, явный вызов move нарушает эти условия. Тем не менее, на stackoverflow пришли к точно такому же выводу.
Это именно с точки зрения «бюрократии». Вообше, не удивлюсь, если на самом деле компиляторы оптимизировать это будут. Но имхо, на это стоит надеяться меньше, чем на «негарантированное (N)RVO». Да и зачем писать больше?
Исходная версия DarkEld3r, :
Можно про это поподробнее? Это по стандарту так?
По стандарту (12.8.31) дела обстоят следующим образом:
— in a return statement in a function with a class return type, when the expression is the name of a non-volatile automatic object (other than a function or catch-clause parameter) with the same cv- unqualified type as the function return type, the copy/move operation can be omitted by constructing the automatic object directly into the function’s return value
— in a throw-expression...
— when a temporary class object that has not been bound to a reference (12.2) would be copied/moved to a class object with the same cv-unqualified type, the copy/move operation can be omitted by constructing the temporary object directly into the target of the omitted copy/move
— when the exception-declaration of an exception handler...
Я не то чтобы очень хороший толкователь стандарта, но в моём понимании, явный вызов move нарушает эти условия. Тем не менее, на stackoverflow пришли к точно такому же выводу.
Это именно с точки зрения «бюрократии». Вообше, не удивлюсь, если на самом деле компиляторы оптимизировать это будут. Но имхо, на это стоит надеяться меньше, чем на «негарантированное (N)RVO». Да и зачем писать больше?