Именованная оптимизация возвращаемого значения включается разрешением копирования, указанным в C ++ 17 в [class.copy.elision] .Соответствующей частью здесь является [class.copy.elision] /1.1:
Когда определенные критерии выполнены, реализация может опустить конструкцию копирования / перемещения классаобъект, даже если конструктор, выбранный для операции копирования / перемещения и / или деструктор для объекта, имеет побочные эффекты.[…]
- в операторе
return
в функции с типом возвращаемого класса, когда выражение является именем энергонезависимого автоматического объекта (кроме введенного параметра функции или переменной).с помощью объявления-исключения обработчика ([исключением. дескриптора])) с тем же типом (игнорируя квалификацию cv) в качестве типа возврата функции, операция копирования / перемещения может быть опущена путем создания автоматическогообъект непосредственно в объекте возврата вызова функции
[…]
выделение мое.Таким образом, компиляторы могут выполнять оптимизацию здесь.И быстрый тест может показаться, что компиляторы действительно выполнят эту оптимизацию здесь ...
Обратите внимание, что const
, тем не менее, может быть проблематичным.Если компилятор не выполняет исключение копирования (это только разрешено, и не обязательно произойдет здесь; даже в C ++ 17, так как выражение в операторе return
не является prvalue), const
, как правило, предотвращает объект отвместо этого перемещается (обычно не может двигаться от const
объекта)…