c++ c++14 language-lawyer constexpr goto

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.