当前位置: 首页 > 知识库问答 >
问题:

` const int a = 1;如果‘a’有自动存储持续时间,那么‘a’是常数表达式吗

通博实
2023-03-14

n 4527 5.20[表达式常数]p2

条件表达式 e 是核心常量表达式,除非按照抽象机器 (1.9) 的规则对 e 进行计算,否则将计算以下表达式之一:

(2.7) — 左值到右值的转换 (4.1),除非它应用于

(2 . 7 . 1)-整数或枚举类型的非易失性glvalue,它引用一个完整的非易失性const对象,该对象具有一个在先初始化,用常量表达式初始化,或

(2.7.2) — 引用字符串文本 (2.13.5) 的子对象的非易失性 gl值,或

(2.7.3)-非易失性glvalue,指用constexpr定义的非易失对象,或指此类对象的不可变子对象,或

(2.7.4) — 文字类型的非易失性 gl值,指的是其生命周期始于 e 评估的非易失性对象;

5.20[expr.const]p5

常量表达式是一个glvalue核心常量表达式,其值引用的实体是常量表达式(定义如下)的允许结果,或者是一个prvalue核心常量表达,其值是一个对象,对于该对象及其子对象:

— 引用类型的每个非静态数据成员都引用一个实体,该实体是常量表达式的允许结果,并且

-如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过该对象结尾的地址(5.7)、函数的地址或空指针值。

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

void foo(){
    const int a = 1;//a has automatic storage duration
    int b[a]{};
}

intb[a]{}a是一个id表达式,a

这是对glvalue积分常量表达式是常量表达式吗?


共有1个答案

淳于博
2023-03-14

可以是prvalue核心常量表达式,但不能是glvalue核心常量,这也不可能。你已经在标准中找到了措辞,所以也许最好解释一下为什么规则是这样的。

void foo(){
    const int a = 1;//a has automatic storage duration
    static constexpr const int &ra = a;// cannot possibly be valid
}

这是无效的,因为它要求在调用foo之前知道a的地址,然后才有任何a

你的int b[a]{};很好,因为它使用a作为prvalue核心常量表达式:它不关心a存储在哪里,它只关心它有什么值。

 类似资料:
  • N4527 5.20【expr.const】p5 常量表达式是glvalue核心常量表达式,其值是指常量表达式(定义如下)的允许结果实体,或者是prvalue核心常量表达式,其值是对象,其中,对于该对象及其子对象: -引用类型的每个非静态数据成员引用一个实体,该实体是常量表达式的允许结果,并且 -如果对象或子对象是指针类型,则它包含具有静态存储持续时间的对象的地址、超过此类对象结尾的地址(5.7)

  • 整型字面值,例如42,就是常量表达式。所以,简单的数学表达式,例如,23x2-4。可以使用其来初始化const整型变量,然后将const整型变量作为新表达的一部分: const int i=23; const int two_i=i*2; const int four=4; const int forty_two=two_i-four; 使用常量表达式创建变量也可用在其他常量表达式中,有些事只能用

  • 问题内容: 我需要计算用户在网站上花费的时间。登出时间与登出时间之间的区别是,给我类似“ X先生花了4个小时43分钟”。因此,为了存储the4小时43分钟,我这样声明: 时间NOT NULL 这是有效的还是更好的存储方式?我需要存储在数据库中,因为我还有其他计算需要将其用于+其他用例。 问题答案: 最好将其存储为整数秒数。 该会是干净和简单-即 正如Tristram所指出的,使用该字段存在局限性

  • 问题内容: 我可以用吗: 代替 后者似乎太冗长。有区别吗? 问题答案: 该声明 将调用(请参阅特殊方法名称文档)并使用该函数的返回值。总结如下: 要求执行真值测试和内置操作;应该返回或,或者它们的整数等效值或。如果未定义此方法,则调用该方法(如果已定义),并且如果其结果为非零,则将该对象视为true。如果一个类既未定义,也未定义,则其所有实例均被视为true。 另一方面, 仅 将参考与进行比较以查

  • 一个简单的问题:有效吗? 换句话说:赋值是一种定义良好的行为,而枚举常量的值集中不存在这种行为吗? 演示:

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存