При отсутствии разрешения копирования гарантированно ли вызывается конструктор копирования / перемещения перед деструктором?

Почти то, что написано в названии. Рассмотрим этот пример:

MyClass func()
{
    MyClass myInstance;
    return myInstance;
}

int main()
{
    auto myInstance = func();
}

В случае отсутствия копии, является ли конструктор копирования или перемещения MyClass гарантированно будет вызываться перед деструктором как вызов func() возвращается myInstance? Я представляю класс как std::shared_ptr будет использовать такое свойство при возвращении по значению.

Кроме того, есть ли подводные камни, чтобы полагаться на это поведение?

1 ответ

Решение

Да.

От [stmt.return]/3:

Инициализация копии возвращаемого объекта выполняется до уничтожения временных объектов в конце полного выражения, установленного операндом оператора return, который, в свою очередь, выполняется до уничтожения локальных переменных (6.6) блок, содержащий оператор возврата.

Другие вопросы по тегам