在C++ 14中,在新表达式的维度中使用double是否有效?

Sha*_*our 42 c++ language-lawyer c++14 new-expression

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

void foo() {
  double d = 5.0;
  auto p1 = new int[d];
}
Run Code Online (Sandbox Code Playgroud)

clang在没有诊断的情况下编译它,而另一方面gcc产生以下诊断(见它在godbolt中生活):

error: expression in new-declarator must have integral or enumeration type
    7 |     auto p1 = new int[d];
      |                       ^
Run Code Online (Sandbox Code Playgroud)

我特意标记了这个C++ 14,因为在C++ 11模式下,clang将其视为格式不正确并产生以下诊断(请参阅godbolt中的内容):

error: array size expression must have integral or unscoped enumeration type, not 'double'
    auto p1 = new int[d];
              ^       ~
Run Code Online (Sandbox Code Playgroud)

clang是否正确?如果是这样,在C++ 14中有什么改变允许这个?

Sha*_*our 44

Clang是正确的,[expr.new] p6中的关键措辞与C++ 11草案中的以下内容有所不同:

noptr-new-declarator中的每个常量表达式都应该是一个整型常量表达式([expr.const])并计算为严格正值.noptr-new-declarator中的表达式应该是整数类型,unscoped枚举类型,或者存在单个非显式转换函数为整数或未整数枚举类型的类类型([class.conv]).如果表达式是类类型,则通过调用该转换函数来转换表达式,并使用转换结果代替原始表达式....

这在C++ 14草案:

noptr-new-declarator中的每个常量表达式都应该是类型的转换常量表达式([expr.const]),并且应该计算为严格正值.noptr-new-declarator中的表达式被隐式转换为....std::size_tstd::size_t

在C++ 14中,对noptr-new-declarator中表达式的要求被削弱为不需要整数,无范围枚举或具有单个非显式转换函数的类到这些类型之一,但只允许隐式转换为size_t.

措辞的变化来自提案A关于调整某些C++语境转换的提案,v3.

  • 我怀疑允许'double`用作数组大小的有用性......似乎更有可能让bug以无声的方式通过其他任何东西:( (19认同)
  • @MatthieuM.我同意,我认为这是一个缺陷,并且意图真的要说"在语境上隐式转换".我今天有希望提交一份缺陷报告,但谁知道我错了:-( (13认同)
  • @MatthieuM.仅供参考我提交了缺陷报告,处理需要一段时间,所以我不希望很快就会有更新. (3认同)