Является ли временное создание как часть аргумента функции вызова гарантированным, чтобы оставаться вокруг до тех пор, пока вызываемая функция не закончится, даже если временное не передается непосредственно функции?
Там практически нет шансов, что это было связно, вот пример:
class A {
public:
A(int x) : x(x) {printf("Constructed A(%d)\n", x);}
~A() {printf("Destroyed A\n");}
int x;
int* y() {return &x;}
};
void foo(int* bar) {
printf("foo(): %d\n", *bar);
}
int main(int argc, char** argv) {
foo(A(4).y());
}
Если A(4)
были переданы непосредственно на foo
, он определенно не будет уничтожен до тех пор, пока вызов foo
не завершится, но вместо этого я вызываю метод во временном и теряю любую ссылку на него. Я бы инстинктивно подумал, что временная A
будет уничтожена до начала foo
, но тестирование с GCC 4.3.4 показывает, что это не так; выход:
Построенный A (4)
foo(): 4
Разрушенный A
Вопрос в том, что - поведение GCC, гарантированное спецификацией? Или компилятор разрешил уничтожить временный A
перед вызовом foo
, не указав указатель на его член, который я использую?