glvalue积分常量表达式是一个常量表达式吗?

时间:2015-07-20 23:22:01

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

N4527 5.20 [expr.const] p3

  

整数常量表达式 是整数或未整数枚举类型的表达式,隐式转换为prvalue,其中转换后的表达式是核心常量表达式。

5.20 [expr.const] p5

  

常量表达式 是一个glvalue核心常量表达式,其值是指一个实体,它是一个常量表达式的允许结果(如下定义),或者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冲突?

1 个答案:

答案 0 :(得分:0)

  

a是一个整数常量表达式吗?

在以下情况中:

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

是的,a是一个整数常量表达式。从你的第一句话开始:

  

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

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

  

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

它有以下条款:

  

左值 - 右值转换(4.1),除非它适用于

有以下例外:

  

整数或枚举类型的非易失性glvalue,它指的是一个完整的非易失性const   具有先前初始化的对象,使用常量表达式初始化,或

适用于a,因为它是非易失性的,const并用常量表达式初始化。

  

a是一个常量表达式吗?

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

  

glvalue积分常量表达式是一个常量表达式吗?

不,为了使它成为一个整数常量表达式,它必须转换为prvalue,因此不能成为glvalue。