【问题标题】:Variable of reference type in constant expressions常量表达式中引用类型的变量
【发布时间】:2019-06-10 00:57:08
【问题描述】:

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

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

好吧,情况是我无法为变量为引用类型的情况提供一个示例。

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

Visual Studio 16.1.2 抱怨:

表达式必须有一个常数值。

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

但是,为什么?

【问题讨论】:

    标签: c++ language-lawyer


    【解决方案1】:

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

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

    • 整数或枚举类型的非易失性左值,它指的是一个完整的非易失性 const 对象,该对象具有前面的初始化、使用常量表达式初始化或
    • 引用字符串字面量子对象的非易失性泛左值,或
    • 一个非易失性泛左值,它引用一个用 constexpr 定义的非易失性对象,或引用此类对象的一个​​非可变子对象,或
    • 文字类型的非易失性左值,它引用一个非易失性对象,该对象的生命周期在 e 的评估中开始;

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


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

    【讨论】:

    • 在 Compiler Explorer https://godbolt.org/z/dlbXF4 gcc 9.1 和 msvc v19.20 可以编译它,而 clang 8.0 失败。 (??)
    • @Loreto 这是提案草案的常见情况
    猜你喜欢
    • 1970-01-01
    • 2018-01-17
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多