variable una tipos que programacion estadistica ejemplos declara constantes constante como c++ c++11 language-lawyer c++03 constant-expression

tipos - ¿Por qué se eliminó la restricción sobre el operador de coma en una expresión constante en C++ 11?



variable en programacion (1)

Recientemente, al responder a una pregunta, me di cuenta de que el operador de coma está permitido en una expresión constante en C++11 siempre que la expresión esté rodeada por () , por ejemplo:

int a[ (1, 2) ] ;

Pre C ++ 11 está prohibido usar el operador de coma en una expresión constante, del borrador de la sección 5.19 estándar pre C ++ 11 que dice ( énfasis mío ):

[...] En particular, excepto en tamaño de expresiones, funciones, objetos de clase, punteros o referencias no se utilizarán, y no se utilizarán operadores de asignación, incremento, decremento, llamada de función o coma.

¿Por qué no se permitió el operador de coma en una expresión constante antes de C ++ 11 y por qué se eliminó esta restricción?


Podemos encontrar la respuesta a esto en el grupo de std-discussion estándar Operador de coma en el hilo de expresión constante donde Gabriel Dos Reis dice:

Para C ++ 11 propuse que lo permitiera porque la restricción parecía arbitraria y todas las razones que he escuchado como razones para su prohibición me parecen poco convincentes y no son convincentes.

y Richard Smith anteriormente en el hilo señala algunos de los usos del operador de coma en una expresión constante tanto en C ++ 11 como en C ++ 14:

No estoy de acuerdo con tu argumento y tu conclusión. En C ++ 11, el operador de coma es útil dentro de las funciones constexpr, porque no se permiten múltiples declaraciones:

template<typename T> constexpr T my_array<T>::at(size_type n) { return (n < size() || throw "n too large"), (*this)[n]; }

En C ++ 14, es útil en todos los casos en los que es útil fuera de las expresiones constantes:

constexpr void do_stuff(int x[]) { for (int i = 0, j = 100; i != j; ++i, --j) x[i] = x[j]; }

Más filosóficamente, no deberíamos prohibir las cosas de las expresiones constantes simplemente porque no somos lo suficientemente imaginativos como para encontrar los casos en que son realmente útiles. Las expresiones constantes no deben ser un idioma secundario semi-aleatorio de C ++, faltan características aleatorias, en la medida en que podamos evitar eso. En estos días, las comas de nivel superior están prohibidas principalmente porque las expresiones constantes tienden a ocurrir en contextos donde una coma significaría algo más.

Tenga en cuenta que se argumentó que su ejemplo de C ++ 11 no es correcto, ya que la expresión que contiene el operador de coma debería estar en () pero su ejemplo proporciona la esencia del argumento. El argumento se basaría en la gramática de la sección 5.19 Expresiones constantes :

constant-expression: conditional-expression

no podemos llegar al operador de coma desde una expresión condicional, pero podemos llegar a la expresión primaria que nos lleva a ( expression ) y luego podemos llegar al operador de coma desde la expresión .

TC señala que este puede no ser el caso, ya que la sección pertinente parece vaga en este punto.