代码之家  ›  专栏  ›  技术社区  ›  Shafik Yaghmour

在C++ 14中,在新表达式的维度中使用双元是有效的吗?

  •  41
  • Shafik Yaghmour  · 技术社区  · 6 年前

    在C++ 14中给出以下代码:

    void foo() {
      double d = 5.0;
      auto p1 = new int[d];
    }
    

    see it live in godbolt ):

    error: expression in new-declarator must have integral or enumeration type
        7 |     auto p1 = new int[d];
          |                       ^
    

    我特别地标记了这个C++ 14,因为在C++ 11模式中,CLAN把它看作是不正确的,并产生下面的诊断( see it live in godbolt ):

    error: array size expression must have integral or unscoped enumeration type, not 'double'
        auto p1 = new int[d];
                  ^       ~
    

    叮当声对吗?如果是这样,C++ 14中发生了什么变化?

    2 回复  |  直到 6 年前
        1
  •  44
  •   Shafik Yaghmour    6 年前

    叮当声是正确的,关键的措辞在 [expr.new]p6 C++ 11草案中的下列更改:

    常量表达式 在一个 noptr新声明符 a中的表达式 应为整型、非作用域枚举型,或存在到整型或非作用域枚举型的单个非显式转换函数的类类型 ([类转换]). 如果表达式是类类型,则通过调用该转换函数来转换表达式,并使用转换结果代替原始表达式。

    this in the C++14 draft :

    常量表达式 在一个 noptr新声明符 应为转换后的常量表达式([表达式常量])类型 std::size_t noptr新声明符 隐式转换为 标准::尺寸 .

    noptr新声明符 被削弱为不需要整数、非作用域枚举或具有 将单个非显式转换函数转换为这些类型之一,但只允许隐式转换为

    措辞的变化源于这项提议 A Proposal to Tweak Certain C++ Contextual Conversions, v3 .

        2
  •  1
  •   Bakudan Lovely    6 年前

    C++17 draft

    在一个 noptr新声明符 std::size_t 并应评估为严格的正值。 a中的表达式 noptr新声明符 标准::尺寸 . [..]

    ([expr.const])