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

C++ 常量表达式中引用类型的变量,c++,language-lawyer,C++,Language Lawyer,在这里,至少可以阅读 三,- 如果变量是constexpr变量,或是 引用类型或常量限定整数或枚举类型,以及 它的初始值设定项是常量初始值设定项 好吧,情况是,我无法为变量是引用类型的情况找到一个例子 在 Visual Studio 16.1.2投诉: 表达式必须具有常量值 变量的值(在第11行声明)不能用作常量 但是,为什么?您的代码在C++17中不合法,因为它包含一个constepr变量,其初始化请求从左值到右值的转换,并且它不是列出的异常之一:(C+17[expr.const]/2.7)

在这里,至少可以阅读

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

好吧,情况是,我无法为变量是引用类型的情况找到一个例子

Visual Studio 16.1.2投诉:

表达式必须具有常量值

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


但是,为什么?

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

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

  • 整型或枚举型的非易失性glvalue,它引用具有先前初始化、使用常量表达式初始化或
  • 引用字符串文字的子对象的非易失性glvalue,或
  • 非易失性glvalue,指的是使用constexpr定义的非易失性对象,或指的是此类对象的不可变子对象,或
  • 一种文本类型的非易失性glvalue值,指的是一个非易失性对象,其生存期开始于
    e
    的计算范围内
如果更改为整数类型而不是
double
,您应该会发现代码已编译



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

在编译器资源管理器gcc 9.1和msvc v19.20中可以编译它,而clang 8.0失败。(?)@Loreto这是提案草案的常见情况
int main()
{
    static const double& ds = 0.5;
    constexpr double cds = ds;
}