Время жизни возвращаемого значения в разделенных запятыми утверждениях - PullRequest
2 голосов
/ 19 октября 2011

Гарантирован ли порядок выполнения трех указанных ниже прокомментированных строк?

struct S
{
    S() { /* called 1st */ }
    ~S() { /* called 3rd */ }
};

boost::shared_ptr<S> f() 
{
    return boost::shared_ptr<S>(new S); 
}

int second() { return 0; /* called 2nd */ }

int test()
{
    return (f(), second());
}

С моим компилятором shared_ptr, возвращаемое f(), кажется, сохраняется до тех пор, пока не будет вызван second().Но гарантируется ли это стандартом и, следовательно, другими компиляторами?

1 Ответ

7 голосов
/ 19 октября 2011

Да .

Времена сохраняются до завершения full-expression.

[n3290: 12.2/3]: Когда реализация вводит временный объект класса, который имеет нетривиальный конструктор (12.1, 12.8), он должен обеспечить вызов конструктора для временного объекта. Точно так же деструктор должен быть вызван для временного нетривиальный деструктор (12.4). Временные объекты уничтожаются как последний шаг в оценке полного выражения (1.9), что (лексически) содержит точку, где они были созданы. Это правда, даже если это оценка заканчивается выбрасыванием исключения. Значение вычислений и Побочные эффекты разрушения временного объекта связаны только с полное выражение, без какого-либо конкретного подвыражения.

И

[n3290: 1.9/10]: Полное выражение - это выражение, которое не является подвыражение другого выражения. Если языковая конструкция определенный для создания неявного вызова функции, использование Языковая конструкция считается выражением для целей этого определения. Вызов деструктору, сгенерированному в конце время жизни объекта, отличного от временного объекта, является неявным полное выражение. Преобразования, примененные к результату выражения в Для того чтобы удовлетворить требования языковой конструкции, в которой выражение, по-видимому, также считается частью полное выражение. [..] * * 1 021

Это означает, что f() и second() должны существовать до тех пор, пока выполнение не вернется из test() с результатом оценки последнего.

...