临时变量是否在语句结束时释放?

unt*_*led 0 c++

我试图找出临时变量何时被释放。我写了下面的代码。

#include <stdio.h>

class C
{
public:
    C()
    {
        printf("C O\n");
    }
    C(const C&)
    {
        printf("C& O\n");
    }
    virtual ~C()
    {
        printf("C D\n");
    }
};

int kkk(const C&)
{
    printf("kkk\n");
    return 0;
}
int kkk2(int)
{
    printf("kkk2\n");
    return 0;
}

int main()
{
    (kkk2( kkk2( (kkk(C()),3) ) ), printf("dsfsdfs\n"), true) && (printf("dsdddf\n"),true);
    printf("=====\n");
    return 0;
}

Run Code Online (Sandbox Code Playgroud)

我期望C类在被调用后被释放kkk,但实际上,结果是:

C O
kkk
kkk2
kkk2
dsfsdfs
dsdddf
C D
=====
Run Code Online (Sandbox Code Playgroud)

我用 g++ clang++ 和 msvc++ 运行代码,结果是一样的。C 类在声明结束时释放。

在语句末尾释放临时变量是 C++ 标准吗?

Jar*_*d42 7

来自Temporary_object_lifetime

所有临时对象都将在评估(词法上)包含它们创建点的完整表达式的最后一步被销毁,如果创建了多个临时对象,则它们将按照与创建顺序相反的顺序被销毁。即使该评估最终引发异常也是如此。

有两个例外:[..]

所以回答你的问题:

在句尾释放临时变量是C++标准吗?

是的,临时变量在完整表达(不是句子)结束时被销毁。