如果在函数调用的参数中创建了一个临时变量,即使这个临时变量没有直接传递给函数,它也能保证在函数结束之前一直存在吗?
可能上面的描述不太清晰,以下是一个例子:
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的行为是否由规范保证?还是编译器可以在调用foo
之前销毁临时对象A
,从而使我使用的成员指针无效?