Вы можете использовать статическую переменную:
static const std::vector<ClassA> empty;
return empty;
Это называется именно для того, чтобы избежать проблем. Новый объект, служащий результатом, инициализируется из локально определенного объекта, затем локально определенный объект уничтожается.
В случае глубокого копирования пользовательского конструктора все одинаково. Сначала выделяется память для объекта, который будет служить результатом, затем вызывается конструктор копирования. Он использует переданную ссылку для доступа к локально определенному объекту и копирования того, что необходимо для нового объекта.
Копия сделана перед названными функциональными выходами и копирует тогдашнюю существующую локальную переменную в возвращаемое значение.
вызванная функция имеет доступ к памяти, которую займет возвращаемое значение, даже при том, что та память не "в объеме", когда копия делается, это все еще доступно.
Согласно ответу на мой вопрос, конструктор копирования может быть вызван даже дважды: один раз для копирования локального объекта в возвращаемый «объект» и один раз для копирования вернуть объект в переменную, которой он был назначен.
Однако, не должно быть ! Компилятор может оптимизировать обе конструкции копирования.
Нет, это называет его, прежде чем местные жители будут уничтожены. Можно протестировать это с объектом, который регистрирует разрушение и конструкцию копии, или путем рассмотрения сгенерированного ассемблерного кода.