在这里,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行声明)不能用作常量
但是,为什么?
答案 0 :(得分:2)
您的代码在C ++ 17中不合法,因为它包含一个constexpr
变量,该变量的初始化请求左值到右值的转换,并且不是列出的异常之一:(C + 17 [expr.const ] /2.7)
从左值到右值的转换(7.1),除非将其应用于
- 整数或枚举类型的非易失性glvalue,它引用具有先前初始化,使用常量表达式初始化的完整非易失性const对象,或者
- 一个非易失性glvalue,它引用字符串文字的子对象,或者
- 非易失性glvalue,它引用用constexpr定义的非易失性对象,或引用该对象的非可变子对象,或者
- 文字类型的非易失性glvalue,指的是其寿命在
e
的求值内开始的非易失性对象;
如果您更改为整数类型而不是double
,则应该找到编译的代码。
您引用的文本来自草稿,因此最终可能会或可能不会成为某些标准的一部分。