and c++ c++17

and - constexpr in c++



¿Cuál es la diferencia entre el constexpr estático y las variables en línea estáticas en C++ 17? (1)

Con C ++ 17 obtenemos variables en línea.

Uno de los usos para ellos es definir campos constantes en las clases.

Entonces, ¿cuál es la diferencia entre estas dos definiciones constantes?

class MyClass { static constexpr int myFirstVar = 10; static const inline int mySecondVar = 100; };

Por supuesto, constexpr hace myFirstVar implícitamente en línea.

¿Cuál es la mejor opción aquí, para usar constexpr o en línea?

Nota: cuando no necesita constness, entonces inline lo hace más fácil. Con constexpr, no tienes esa opción.


No es necesario que especifique un inicializador para mySecondVar en el momento de la declaración. Tampoco es necesario que el inicializador sea constexpr .

Esto significa que si intentamos definir myFirstVar esta manera:

class MyClass { static constexpr int myFirstVar; }; int MyClass::myFirstVar = 1;

O así:

#include <cstdlib> class MyClass { static constexpr int myFirstVar = rand(); };

Está mal formado de cualquier manera. constexpr semántica constexpr demanda y por una buena razón.

El enfoque del especificador en inline nos permite incluir una definición de variable estática en el encabezado en sí, sin que el inicializador sea constexpr ; o si el inicializador es bastante complejo, no tiene que estar en la definición de la clase en sí.

Entonces este es un encabezado perfectamente válido en C ++ 17:

#include <cstdlib> class MyClass { static const int mySecondVar; }; inline const int MyClass::mySecondVar = rand();

El estándar nos promete que todas las unidades de traducción que incluyen el encabezado verán el mismo valor para la variable, aunque no sabremos qué es hasta el tiempo de ejecución.

Es principalmente una herramienta para escritores de bibliotecas. Supongamos que su biblioteca es solo encabezado. Entonces, en los viejos tiempos, ¿cuáles eran tus opciones si necesitabas una constante estática como esta?

Bueno, podría tener un archivo objeto enviado con su biblioteca. Se compilará a partir de una unidad de traducción que contenga solo la definición constante. Ahora la biblioteca no es solo encabezado.

O puede confiar en las funciones en línea en su lugar. El efecto variable en línea se puede lograr con lo siguiente:

class MyClass { static inline int mySecondVar(); }; inline int MyClass::mySecondVar() { static const int value = rand(); return value; }

Pero está escondido detrás de una pared de sintaxis, y enmascara lo que es esencialmente una constante, con un operador de llamada de función.