c++ c++14 language-lawyer new-expression

auto c++



En C++ 14, ¿es válido usar un doble en la dimensión de una nueva expresión? (2)

De C ++ 14 a c ++ 17 (para los que se preguntan como yo), las frases siguen siendo prácticamente las mismas (a diferencia de C ++ 11 a C ++ 14 como contestó @ShafikYaghmour), como se indica en esta C + +17 borrador :

Cada expresión constante en un noptr-new-declarator será una expresión constante convertida de tipo std::size_t y se evaluará con un valor estrictamente positivo. La expresión en un noptr-new-declarator se convierte implícitamente a std::size_t . [..]

solo falta esta parte ([expr.const]) del borrador de C ++ 17.

En C ++ 14 dado el siguiente código:

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

clang compila esto sin diagnóstico, mientras que gcc, por otro lado, produce el siguiente diagnóstico ( véalo en vivo en godbolt ):

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

Etiqueté específicamente este C ++ 14 porque en el modo C ++ 11, clang trata a este como mal formado y produce el siguiente diagnóstico ( verlo en vivo en godbolt ):

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

Es clang correcto? Si es así, ¿qué cambió en C ++ 14 para permitir esto?


El Clang es correcto, la redacción clave en [expr.new]p6 cambia de lo siguiente en el borrador de C ++ 11:

Cada expresión constante en un noptr-new-declarator será una expresión constante integral ([expr.const]) y se evaluará con un valor estrictamente positivo. La expresión en un noptr-new-declarator será de tipo integral, tipo de enumeración sin ámbito, o un tipo de clase para el cual existe una función de conversión no explícita a tipo de enumeración integral o sin ámbito ([class.conv]). Si la expresión es de tipo de clase, la expresión se convierte al llamar a esa función de conversión, y el resultado de la conversión se usa en lugar de la expresión original. ...

A esto en el borrador de C ++ 14 :

Cada expresión constante en un noptr-new-declarator será una expresión constante convertida ([expr.const]) de tipo std::size_t y se evaluará con un valor estrictamente positivo. La expresión en un noptr-new-declarator se convierte implícitamente a std::size_t . ...

En C ++ 14, el requisito de la expresión en un nuevo declarador noptr se debilitó para no requerir una enumeración integral sin ámbito o una clase con una función de conversión única no explícita para uno de esos tipos, pero solo permitir conversiones implícitas a size_t .

El cambio en la redacción provino de la propuesta Una propuesta para modificar ciertas conversiones contextuales de C ++, v3 .