При отсутствии разрешения копирования гарантированно ли вызывается конструктор копирования / перемещения перед деструктором?
Почти то, что написано в названии. Рассмотрим этот пример:
MyClass func()
{
MyClass myInstance;
return myInstance;
}
int main()
{
auto myInstance = func();
}
В случае отсутствия копии, является ли конструктор копирования или перемещения MyClass
гарантированно будет вызываться перед деструктором как вызов func()
возвращается myInstance
? Я представляю класс как std::shared_ptr
будет использовать такое свойство при возвращении по значению.
Кроме того, есть ли подводные камни, чтобы полагаться на это поведение?
1 ответ
Решение
Да.
От [stmt.return]/3:
Инициализация копии возвращаемого объекта выполняется до уничтожения временных объектов в конце полного выражения, установленного операндом оператора return, который, в свою очередь, выполняется до уничтожения локальных переменных (6.6) блок, содержащий оператор возврата.