常量表达式中引用类型的变量

时间:2019-06-10 00:57:08

标签: c++ language-lawyer

在这里,http://eel.is/c++draft/expr.const#2.7处可以读取

  

3-   如果变量是constexpr变量或属于constexpr变量,则在遇到其初始化声明后可在常量表达式中使用   引用类型或const限定整数或枚举类型,以及   它的初始化程序是一个常量初始化程序。

嗯,这种情况是我无法为变量是引用类型的情况提供一个例子。

int main()
{
    static const double& ds = 0.5;
    constexpr double cds = ds;
}

Visual Studio 16.1.2抱怨:

  

表达式必须具有恒定值。

     

变量的值(在第11行声明)不能用作常量

但是,为什么?

1 个答案:

答案 0 :(得分:2)

您的代码在C ++ 17中不合法,因为它包含一个constexpr变量,该变量的初始化请求左值到右值的转换,并且不是列出的异常之一:(C + 17 [expr.const ] /2.7)

  

从左值到右值的转换(7.1),除非将其应用于

     
      
  • 整数或枚举类型的非易失性glvalue,它引用具有先前初始化,使用常量表达式初始化的完整非易失性const对象,或者
  •   
  • 一个非易失性glvalue,它引用字符串文字的子对象,或者
  •   
  • 非易失性glvalue,它引用用constexpr定义的非易失性对象,或引用该对象的非可变子对象,或者
  •   
  • 文字类型的非易失性glvalue,指的是其寿命在e的求值内开始的非易失性对象;
  •   

如果您更改为整数类型而不是double,则应该找到编译的代码。


您引用的文本来自草稿,因此最终可能会或可能不会成为某些标准的一部分。