【问题标题】:Is a glvalue integral constant expression a constant expression?泛左值整数常量表达式是常量表达式吗?
【发布时间】:2015-07-20 23:22:00
【问题描述】:

N4527 5.20 [expr.const]p3

整数常量表达式是整数或无范围枚举类型的表达式,隐式转换为纯右值,其中转换后的表达式是核心常量表达式。

5.20 [expr.const]p5

常量表达式要么是一个泛左值核心常量表达式,其值是指一个实体,该实体是常量表达式(如下定义)的允许结果,要么是一个prvalue 核心常量表达式 value 是一个对象,对于该对象及其子对象:

(5.1) — 每个引用类型的非静态数据成员指的是一个实体,它是一个常量的允许结果 表达,和

(5.2) — 如果对象或子对象是指针类型,它包含静态存储对象的地址 持续时间、此类对象末尾的地址 (5.7)、函数的地址或空指针 价值。

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

void foo(){
    const int a = 1;//a has automatic storage duration
    // all ok in gcc 5.1.0 and clang 3.8.0
    int b[a]{};
    static_assert(a,"");
    switch(1){
      case a:
        ;
    }
}

问题1:a 是整数常量表达式吗?

问题2:a 是常量表达式吗?

问题3:glvalue整型常量表达式是常量表达式吗?

问题4:

如果问题 3 的答案是肯定的, 如果对象具有自动存储持续时间,这是否与 5.20 p3 冲突?

【问题讨论】:

  • 嗯,每个问题一个问题。一。不是五个。
  • @Lightness Races in Orbit 主要问题是 4,但如果 3 不是,则没有必要问 4,以此类推。 1、2 和 3 是 4 的一部分。
  • a 是一个常量表达式,因为 [expr.const]/(2.7.1)。
  • @KerrekSB:仅当应用了左值到右值的转换时。
  • @KerrekSB a 是一个核心常量表达式,因为 [expr.const]/(2.7.1)。

标签: c++ language-lawyer constant-expression


【解决方案1】:

a 是整数常量表达式吗?

在以下情况下:

int b[a]{};
static_assert(a,"");
switch(1){
  case a:
    ;
}

是的,a 是一个整数常量表达式。从您的第一个报价开始:

整型常量表达式是整型或无范围枚举类型的表达式,隐式转换 到prvalue,其中转换后的表达式是核心常量表达式。

'a' 是一个整数类型,在您的情况下它将被隐式转换为纯右值,那么现在a 是一个核心常量表达式吗?是的,如果我们回到定义什么不是核心常量表达式的第 2 段:

条件表达式 e 是核心常量表达式,除非 e 的求值遵循 抽象机(1.9),将评估以下表达式之一

它有以下子句:

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

以下例外:

一个整数或枚举类型的非易失性左值,它引用一个完整的非易失性常量 具有前面初始化的对象,用常量表达式初始化,或

这适用于a,因为它是非易失的、常量的,并且使用常量表达式进行初始化。


a 是常量表达式吗?

在与上面相同的上下文中,是的,因为我们可以从上面的引用中看到它是一个核心常量表达式。


glvalue 整数常量表达式是常量表达式吗?

不,为了使它成为一个整型常量表达式,它必须转换为纯右值,因此不能是泛左值。

【讨论】:

  • @T.C. @Matt McNabb 首先,a 是一个 id 表达式,它是一个左值表达式,它是一个核心常量表达式。是整数常量表达式吗?
  • @T.C.说“glvalue 表达式a 不是整数常量表达式。” @Shafik Yaghmour 说“是”。
  • 核心常量表达式转换前为整型常量表达式,还是转换后为整型常量表达式?
  • @stackcpp 所以这些都在某些表达式的上下文中,所以常量表达式是conditional-expression,因此您正在寻找语法中出现conditional-expression 或constant-expression 的位置。
  • 我最初的想法是const int a = 1;//a has automatic storage duration,根据5.20p5,在常量表达式中,glvalue核心常量表达式所引用的对象必须具有静态存储时长。所以a不是常量表达式,但是可以作为数组边界,所以是整数常量表达式。这很奇怪。整数常量表达式不是常量表达式。一定是哪里出了问题,但是我找不到。
猜你喜欢
  • 2017-03-30
  • 2016-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-20
  • 2015-09-16
  • 2011-06-30
  • 1970-01-01
相关资源
最近更新 更多