Vous n'avez pas à spécifier un initialiseur pour mySecondVar
au moment de la déclaration. Ni l'initialiseur doivent être constexpr
lui-même.
Cela signifie que si nous tentons de définir myFirstVar
comme ceci:
class MyClass {
static constexpr int myFirstVar;
};
int MyClass::myFirstVar = 1;
Ou comme ceci:
#include <cstdlib>
class MyClass {
static constexpr int myFirstVar = rand();
};
C'est mal formé de toute façon. constexpr
de la sémantique de la demande et pour une bonne raison.
L' inline
spécificateur approche nous permet d'inclure une variable statique définition dans l'en-tête lui-même, sans l'initialiseur être constexpr
; ou si l'initialiseur est assez complexe, il n'a pas à être dans la définition de la classe elle-même.
C'est donc à merveille un en-tête valide en C++17:
#include <cstdlib>
class MyClass {
static const int mySecondVar;
};
inline const int MyClass::mySecondVar = rand();
La norme nous promet que toutes les unités de traduction qui incluent l'en-tête du voir la même valeur pour la variable, même si nous ne savons pas ce que c'est jusqu'au moment de l'exécution.
C'est surtout une bibliothèque des écrivains de l'outil. Supposons que votre bibliothèque est d'en-tête uniquement. Puis, dans les temps anciens, quelles ont été vos options si vous avez besoin d'une constante statique définie comme ceci?
Eh bien, vous pourriez avoir un fichier de l'objet livré avec votre bibliothèque. Elle sera compilée à partir d'une unité de traduction qui contient juste la définition de constante. Maintenant, la bibliothèque n'est pas d'en-tête uniquement.
Ou, vous pouvez compter sur les fonctions inline à la place. La variable inline l'effet peut être réalisé avec les éléments suivants:
class MyClass {
static inline int mySecondVar();
};
inline int MyClass::mySecondVar() {
static const int value = rand();
return value;
}
Mais il est caché derrière un mur de la syntaxe, et les masques de ce qui est essentiellement une constante, avec un appel de fonction de l'opérateur.