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

Variable of reference type in constant expressions

本文关键字:变量 引用类型 表达式 常量      更新时间:2023-10-16

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

3 - 如果变量是 constexpr 变量,或者它是 引用类型或常量限定的整数或枚举类型,以及 其初始值设定项是一个常量初始值设定项。

好吧,情况是我无法为自己找出变量为引用类型的情况的示例。

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

Visual Studio 16.1.2 抱怨:

表达式必须具有常量值。

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

但是为什么?

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

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

  • 整数或枚举类型的非易失性 gl值,它引用具有前面初始化的完整非易失性 const 对象,使用常量表达式初始化,或
  • 引用字符串文本的子对象的非易失性 glvalue ,或
  • 非易失性 gl值,指使用 constexpr 定义的非易失性对象,或指此类对象的不可变子对象,或
  • 文字类型的非易失性 glvalue ,指的是其生命周期始于e评估的非易失性对象;

如果更改为整数类型而不是double,您应该会发现代码编译。


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