c++ - ¿Por qué no permitir goto en las funciones constexpr?
c++14 language-lawyer (2)
Mi entendimiento es que hubo un deseo de relajarme en la semántica constexpr
en C ++ 14. Muchas de las restricciones que se relajaron fueron directas, pero algunas fueron más controvertidas o difíciles o [inserte el adjetivo de su elección aquí]. En lugar de mantener la constexpr
relajada por la capacidad de usar goto
, se decidió publicar los cambios principales y evitar el resto. Esto parece una opción bastante constexpr
, ya que constexpr
en C ++ 14 es mucho más poderoso que constexpr
en C ++ 11, y no poder usar goto
es una ausencia menor, considerando todo.
Dicho esto, ciertamente existe la opinión de que tener goto
en contextos constexpr
es útil y posible. De hecho, la propuesta inicial para relajarse constexpr
permitió. Entonces, tal vez todo lo que necesita es alguien que quiera que escriba una propuesta para agregarla. ¡Que alguien puedas ser tú! aparentemente fue Ville Voutilainen hace dos años en N4472 , que presentaba el párrafo bastante relevante a esta pregunta de:
Hay rumores sin fundamento según los cuales prohibir goto en expresiones constantes es más por razones de gusto que por razones técnicas, lo que significa que no es particularmente difícil apoyar goto en expresiones constantes. No puedo decir si eso es correcto para las implementaciones en general.
El documento tuvo una recepción mixta, pero ahora que tenemos constexpr lambdas, tal vez sea necesario volver a visitarlo. Y ese alguien podría ser tú!
C ++ 14 tiene reglas para lo que puede y no puede hacer en una función constexpr
. Algunos de ellos (sin asm
, sin variables estáticas) parecen bastante razonables. Pero el estándar también constexpr
goto
en constexpr
funciones constexpr
, incluso cuando permite otros mecanismos de control de flujo.
¿Cuál es el razonamiento detrás de esta distinción?
Pensé que habíamos pasado " goto es difícil para compiladores ".
se espera que constexpr
sea evaluado por el front-end del compilador en algún modo pseudointerpretado o en el árbol de sintaxis abstracta construido en una sola pasada antes de que se genere cualquier código ejecutable. Sabemos que goto
puede saltar a alguna parte al final de la función que aún no se evaluó. Por lo tanto, conectar correctamente la llamada y ejecutar goto
forzaría la creación de AST en varias pasadas y saltar fuera de orden entre nodos en un árbol sigue siendo una operación desordenada que podría interrumpir algún estado. Así que tal construcción no vale la pena.