相关疑难解决方法(0)

什么是具有静态存储持续时间的临时对象

灵感来自这个答案,来自[expr.const]

常量表达式是glvalue核心常量表达式,它指的是一个实体,它是常量表达式的允许结果(如下所定义),或者是一个prvalue核心常量表达式,其值满足以下约束:

  • 如果值是类类型的对象,则引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,

  • 如果值是指针类型,则它包含具有静态存储持续时间的对象的地址,超过此类对象末尾的地址([expr.add]),函数的地址或空指针值,以及

  • 如果值是类或数组类型的对象,则每个子对象都满足这些值的约束.

如果实体是具有静态存储持续时间对象,则该实体是常量表达式的允许结果,该对象不是临时对象,或者是其值满足上述约束的临时对象,或者它是函数.

什么是具有静态存储持续时间的临时对象?我是否遗漏了某些东西,或者说对象是暂时的并且具有静态存储持续时间是矛盾的吗?

来自[basic.stc.static]的定义

所有没有动态存储持续时间,没有线程存储持续时间且不是本地的变量都具有静态存储持续时间.这些实体的存储应持续该计划的持续时间

仅适用于变量.

c++ language-lawyer

13
推荐指数
1
解决办法
546
查看次数

临时对象存放在哪里?

IMO临时对象存储在动态(堆)内存中,但我不确定.你能否确认或否认我的想法?

c++ temporary-objects

11
推荐指数
3
解决办法
2833
查看次数

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

请考虑以下代码:

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上面代码中的局部变量是否允许重用以前由临时占用的内存,还是应该使用不同的存储?

c++ memory memory-management duration

3
推荐指数
1
解决办法
172
查看次数