2016-02-03 7 views
2

Давайте предположим, что у меня есть следующий код:Когда именно возвращаемое значение копируется

int bar = 0; 

struct Foo { 
    ~Foo() { bar = 1; } 
}; 

int main(int argc, char ** argv) { 
    Foo f; 
    return bar; 
} 

Что будет возвращаемым значением программы? 0 или 1?

+0

Почему это было бы неопределенным поведением ?! –

+2

Я не думаю, что параноида UB - такая плохая вещь. – Bathsheba

+0

@ Батшеба: Мех. Если бы это был UB, простые вещи, такие как 'std :: lock_guard', не работали бы и не возвращали бы уникальные указатели по значению. –

ответ

12

С [stmt.return]/3:

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

Таким образом, деструктор запускается после инициализации возвращаемого значения, поэтому возвращаемое значение равно 0 при первом вызове вашей функции.

+0

awesome, спасибо за цитату – Paladin

2

Автоматические переменные удаляются в обратном порядке для их объявления.

Таким образом, возвращаемое значение функции устанавливается до вызова ~Foo().

Возвращение foobar поэтому очень хорошо определено 0.

Ваш вопрос будет более интересно, если ваша функция вернула int&.

Смежные вопросы