Оператор разыменования на временном объекте - PullRequest
0 голосов
/ 23 сентября 2019

В подобном коде

#include <iostream>
#include <memory>

struct A {
    int i;

    A() {
        std::cout << "A()" << std::endl;
    }

    ~A() {
        std::cout << "~A()" << std::endl;
    }
};

void f(const A& a) {
    std::cout << "f(A)" << std::endl;
}

std::unique_ptr<A> make_a() {
    return std::make_unique<A>();
}

int main() {
    f(*make_a());
}

Есть ли гарантия, что объект A будет удален только после выполнения f()?

Ответы [ 5 ]

5 голосов
/ 23 сентября 2019

Да, гарантируется, что временный будет уничтожен после полного выражения, которое включает вызов функции f().

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

3 голосов
/ 23 сентября 2019

Есть ли гарантия, что объект A будет удален только после выполнения f ()?

Стандарт C ++ гарантирует, что все временные объекты будут жить до тех пор, пока не завершится оценка полное выражение (заканчивающееся точкой с запятой ;).См. Время жизни для получения полной информации:

Все временные объекты уничтожаются как последний шаг в оценке полного выражения, которое (лексически) содержит точку, где они были созданы, и еслиСоздано несколько временных объектов, они уничтожаются в порядке, противоположном порядку создания.Это верно, даже если эта оценка завершается выдачей исключения.

3 голосов
/ 23 сентября 2019

Временные объекты уничтожаются, когда полное выражение участвует в концах.

В вашем случае полное выражение равно f(*make_a()), что означает, чтообъект будет уничтожен после завершения вызова f (после возврата функции f).

3 голосов
/ 23 сентября 2019

Объект будет удален после вычисления полного выражения f(*make_a());

3 голосов
/ 23 сентября 2019

Да, это правильно.Стандарт C ++ четко утверждает, что все анонимные временные данные, переданные в качестве параметров функции, выживают при вызове функции.

...