Описание тега copy-elision
Copy Elision является исключением из правила "как если бы", регулирующего поведение программ на C++.
Оптимизация возвращаемого значения - это копирование, применяемое к возвращаемым значениям.
12.8 Копирование и перемещение объектов класса
[class.copy]
31 При соблюдении определенных критериев реализации разрешается опускать конструкцию копирования / перемещения объекта класса, даже если конструктор, выбранный для операции копирования / перемещения, и / или деструктор для объекта имеют побочные эффекты. В таких случаях реализация рассматривает источник и цель пропущенной операции копирования / перемещения как просто два разных способа ссылки на один и тот же объект, и уничтожение этого объекта происходит в более позднее время, когда эти два объекта были бы уничтожается без оптимизации.123
Такое исключение операций копирования / перемещения, называемое исключением копирования, разрешается в следующих случаях (которые могут быть объединены для удаления нескольких копий):
- в
return
в функции с типом возвращаемого значения класса, когда выражение является именем энергонезависимого автоматического объекта (кроме функции или параметра catch-clause) с тем же типом cv-unqualified, что и тип возвращаемого значения функции, копией / Операция перемещения может быть опущена путем создания автоматического объекта непосредственно в возвращаемое значение функции- в выражении throw, когда операнд - это имя энергонезависимого автоматического объекта (кроме функции или параметра catch-clause), область действия которого не выходит за пределы самого внутреннего включающего блока try (если он есть), операцию копирования / перемещения из операнда в объект исключения (15.1) можно опустить, создав автоматический объект непосредственно в объекте исключения.
- когда временный объект класса, который не был привязан к ссылке (12.2), будет скопирован / перемещен в объект класса с тем же типом cv-unqualified, операция копирования / перемещения может быть опущена путем создания временного объекта непосредственно в цель пропущенной копии / перемещения
- когда объявление исключения обработчика исключения (раздел 15) объявляет объект того же типа (кроме cv-qualification), что и объект исключения (15.1), операцию копирования можно опустить, рассматривая объявление исключения как псевдоним для объекта исключения, если значение программы не изменится, за исключением выполнения конструкторов и деструкторов для объекта, объявленного в объявлении исключения.