临时存储时间的要求是什么?

sha*_*oth 3 c++ memory memory-management duration

请考虑以下代码:

class Test() {
public:
    Test()
    {
       memset( buffer, 0, sizeof( buffer ) );
    }
    void Process()
    {
       printf( buffer );
    }
private:
    char buffer[1000];
};

int main()
{
    Test().Process();
    char buffer[1000] = {};
    print( buffer );
    return 0;      
}
Run Code Online (Sandbox Code Playgroud)

我无法推断是否buffer允许在main中重用以前由临时对象占用的内存class Test.根据标准自动存储(3.7.2/1)必须至少持续到块结束.

我找不到强制临时对象使用自动存储的措辞,除了6.6/2,其中描述了一个跳转语句,并说在退出范围[...]时,所有构造对象都会调用析构函数(12.4)具有自动存储持续时间(3.7.2)(命名对象或临时对象),这似乎意味着临时使用自动存储.

临时工需要使用自动存储吗?main上面代码中的局部变量是否允许重用以前由临时占用的内存,还是应该使用不同的存储?

Dav*_*eas 6

临时的生存期(除非绑定到a const&)延伸到完整表达式的末尾.在你的情况下第一行main.允许编译器重用相同的内存,但它是否具有实现细节(即实现的质量)

12.2 [class.temporary]

/ 3 [...]临时对象被作为评估全表达式(1.9)的最后一步而被销毁,该表达式(词法上)包含创建它们的点.[...]

/ 4有两种情况,临时表在与完整表达结束时不同的点被销毁.第一个上下文是表达式作为定义对象的声明符的初始值设定项.[...]

/ 5第二个上下文是引用绑定到临时的.

由于您既不是例外,Test临时属于第一类,并且作为评估第一行的最后一步被销毁.