常量表达式中引用类型的变量
Variable of reference type in constant expressions
在这里,在 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
,您应该会发现代码编译。
您引用的文本来自草案,因此,最终可能会也可能不会构成某些标准的一部分。
相关文章:
- 强制转换为引用类型
- 在 lambda 捕获中声明的变量的类型推导
- 自定义引用类型
- 是否可以在不使用 decltype 的情况下推断先前定义的 extern 变量的类型
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- 常量成员函数中成员变量的类型
- 为什么我不能在运算符=中使用引用类型?
- 可变参数模板函数参数和引用类型推导
- 隐式可转换参数,但属于引用类型
- 如何告诉自动推断向量<bool>元素的非引用类型
- 如何使用 ifstream 检查文件中变量的类型?
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 引用类型的数据成员提供有关恒常正确性"loophole"
- 为什么引用类型在使用临时对象访问时是左值
- 常量表达式中引用类型的变量
- 为什么我不能使用 constexpr 全局变量来初始化 constexpr 引用类型
- 引用类型变量 c++ 的 Getters
- C++11 引用类型的成员变量,向量push_back后的不同行为
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- 引用类型变量初始化和存储