gpt4 book ai didi

c++ - 作为函数调用的一部分创建的临时对象何时被销毁?

转载 作者:IT老高 更新时间:2023-10-28 21:41:31 27 4
gpt4 key购买 nike

作为函数调用参数的一部分创建的临时变量是否保证在被调用函数结束之前一直存在,即使临时变量没有直接传递给函数?

几乎没有机会是连贯的,所以这里有一个例子:

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 进行的测试表明事实并非如此;输出是:

Constructed A(4)
foo(): 4
Destroyed A

问题是,规范是否保证 GCC 的行为?还是允许编译器在调用 foo 之前销毁临时 A,从而使指向我正在使用的成员的指针无效?

最佳答案

临时对象一直存在到创建它们的完整表达式的末尾。

在您的示例中,由 A(4) 创建的 A 对象将存在 至少,直到表达式在从调用 foo().

语言标准保证了这种行为:

Temporary objects are destroyed as the last step in evaluating the full-expression (1.9) that (lexically) contains the point where they were created. This is true even if that evaluation ends in throwing an exception (C++03 §12.2/3).

可以通过绑定(bind)对它的引用来延长临时对象的生命周期(在这种情况下,它的生命周期会延长到引用的生命周期结束),或者通过将它用作构造函数的初始值设定项列表中的初始值设定项(在在这种情况下,它的生命周期会延长,直到正在构造的对象完全构造)。

关于c++ - 作为函数调用的一部分创建的临时对象何时被销毁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3041249/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com