and - constexpr c++ que es
¿Debemos usar constexpr en todas partes que podamos? (3)
Obviamente no podemos hacer todo constexpr
. Y si no hacemos nada constexpr
, bueno, no habrá grandes problemas. Mucho código se ha escrito sin él hasta ahora.
¿Pero es una buena idea abofetear a constexpr
en algo que pueda tenerlo? ¿Hay algún problema potencial con esto?
¿Por qué no me molesto en intentar poner constexpr
en cada oportunidad en forma de lista y sin ningún orden en particular?
- No escribo funciones de una sola línea que a menudo
- cuando escribo una sola línea, generalmente delega en una función no constexpr (por ejemplo,
std::get
ha aparecido varias veces recientemente) - los tipos sobre los que operan no son siempre tipos literales; sí, las referencias son tipos literales, pero si el tipo referido no es literal, no puedo tener ninguna instancia en tiempo de compilación de todos modos
- El tipo que devuelven no siempre es literal.
- simplemente no son todos útiles o incluso significativos en tiempo de compilación en términos de su semántica
- Me gusta separar la implementación de la declaración
Las funciones Constexpr tienen tantas restricciones que son un nicho para uso especial solamente. No es una optimización, o un conjunto de funciones deseable en general. Cuando escribo uno, a menudo es porque una metafunción o una función normal por sí sola no lo habrían cortado y tengo una mentalidad especial para ello. Las funciones de Constexpr no saben como otras funciones.
No tengo una opinión o consejo en constexpr
sobre los constructores de constexpr
porque no estoy seguro de poder constexpr
por completo y los literales definidos por el usuario aún no están disponibles.
No molestará al compilador. El compilador le dará (o debería hacerlo) un diagnóstico cuando / si lo usa en un código que no cumple con los requisitos de un constexpr
.
Al mismo tiempo, estaría un poco indeciso de darle una bofetada porque podrías. Aunque no moleste o no moleste al compilador , su audiencia principal son otras personas que leen el código. Al menos en la OMI, debe usar constexpr
para transmitirles un significado bastante específico, y solo darle una bofetada en otras expresiones porque puede ser engañoso. Creo que sería justo para un lector preguntarse qué estaba pasando con una función que está marcada como un constexpr
, pero que solo se usa como una función normal en tiempo de ejecución.
Al mismo tiempo, si tiene una función que honestamente espera usar en tiempo de compilación, y aún no la ha utilizado de esa manera, marcarla como constexpr
podría tener mucho más sentido.
Si Creo que poner esa const
siempre es una buena práctica siempre que pueda. Por ejemplo, en su class
si un método determinado no modifica a ningún miembro, siempre tiende a poner una palabra clave const
al final.
Además del aspecto del lenguaje, mencionar la const
también es una buena indicación para el programador / revisor futuro de que la expresión está teniendo constancia en esa región. Se relaciona con las buenas prácticas de codificación y se suma a la legibilidad también. por ejemplo (de @Luc)
constexpr int& f(int& i) { return get(i); }
Ahora, poner constexpr
sugiere que get()
también debe ser un constexpr
.
No veo ningún problema o implicación debido constexpr
.
Editar : hay una ventaja adicional de constexpr
es que puede usarlos como argumentos de template
en algunas situaciones.