que and c++ c++11 main language-lawyer constexpr

and - constexpr c++ que es



¿Por qué principal no puede ser un constexpr? (4)

Cuando intentas usar constexpr con main esta manera:

constexpr int main()

gcc y clang se quejan

error: no se puede declarar '':: main'' en línea

error: ''main'' no puede ser declarado constexpr

Veamos cuáles son los requisitos para la función constexpr:

Una función constexpr debe cumplir los siguientes requisitos:

  • no debe ser virtual
  • su tipo de retorno debe ser LiteralType
  • Cada uno de sus parámetros debe ser de tipo literal.

¿Qué es LiteralType?

Un tipo literal es cualquiera de los siguientes

  • nula (desde c ++ 14)
  • tipo escalar
  • tipo de referencia
  • una matriz de tipo literal

¿Qué debe incluir la función corporal?

  • declaraciones nulas
  • declaraciones static_assert
  • Declaraciones de typedef y declaraciones de alias que no definen clases o enumeraciones
  • usando declaraciones
  • usando directivas
  • exactamente una declaración de retorno que contiene solo valores literales, variables constexpr y funciones.

Los siguientes ejemplos:

constexpr int main() { ; } constexpr int main() { return 42; } constexpr int main() { // main defaults to return 0 }

Parece que cumple todos estos requisitos. También con eso, main es una función especial que se ejecuta al inicio del programa antes que todo lo demás. Puede ejecutar las funciones constexpr desde main, y para que algo marcado constexpr sea constexpr, debe ejecutarse en un contexto constexpr.

Entonces, ¿por qué no se permite que main sea un constexpr?


El estándar da la firma precisa para main , por lo que el compilador puede rechazar otras firmas. Aún más específicamente, prescribe que main no puede ser constexpr , static , o algunas otras cosas.

Si se pregunta por qué , al compilador se le permite insertar un código al principio de main (para hacer cosas como inicializar variables globales, etc.) lo que podría hacer que no sea constexpr (razón por la cual, por ejemplo, un programa no puede llamar). principal explícitamente).


En mi opinión, la razón es que no tiene sentido declarar main() como constexpr y el comité de estándares quiere que el lenguaje de programación C ++ tenga sentido.

La función main() es una función especial que se ocupa de la inicialización del punto de entrada del programa; no es sensato utilizarla para calcular valores de tiempo de compilación.


No tiene ningún sentido declarar main como constexpr por dos razones: 1) Es una función de tiempo de ejecución. 2) No puede ser llamado desde otras funciones o recursivamente.


No, esto no está permitido. El borrador del estándar C ++ en la sección 3.6.1 La función principal, párrafo 3, dice:

[...] Un programa que define main como eliminado o que declara que main está en línea, estático o constexpr está mal formado. [...]

main tiene que ser una función de tiempo de ejecución y, como Lightness dice que no tiene sentido, ya que no se puede optimizar la distancia main .