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 astd::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 astd::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 .