LINUX.ORG.RU

История изменений

Исправление 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». Да и зачем писать больше?