80 votes

Quelle est la différence entre les variables statiques constexpr statiques et les variables en ligne statiques en C ++ 17?

Avec C++17 nous obtenons inline variables.

L'une d'utilisation pour eux est de définir des champs constants dans les classes.

Alors, quelle est la différence entre ces deux définitions de constantes:

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

Bien sûr, constexpr fait myFirstVar implicitement en ligne.

Quel est le meilleur choix ici, pour utiliser constexpr ou inline?

Remarque: lorsque vous n'avez pas besoin constness, alors inline la rend plus facile. Avec constexpr vous n'avez pas le choix.

77voto

StoryTeller Points 6139

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X