365 votes

const __classid vs sur variables

Y a-t-il une différence entre les définitions qui suivent ?

Si ce n’est pas le cas, quel style est préféré à C ++11 ?

416voto

Howard Hinnant Points 59526

Je crois qu'il existe une différence. Nous allons renommer pour que nous puissions en parler plus facilement:

const     double PI1 = 3.141592653589793;
constexpr double PI2 = 3.141592653589793;

Les deux PI1 et PI2 sont constants, ce qui signifie que vous ne pouvez pas les modifier. Cependant, seulement PI2 est une constante de compilation. Il doit être initialisé lors de la compilation. PI1 peut être initialisé au moment de la compilation ou de l'exécution. En outre, seulement PI2 peut être utilisé dans un contexte qui nécessite une constante de compilation. Par exemple:

constexpr double PI3 = PI1;  // error

mais:

constexpr double PI3 = PI2;  // ok

et:

static_assert(PI1 == 3.141592653589793, "");  // error

mais:

static_assert(PI2 == 3.141592653589793, "");  // ok

Que vous devez utiliser? Utilisez celui qui répond à vos besoins. Ne vous voulez vous assurer que vous avez un moment de la compilation constante qui peut être utilisé dans des contextes où une constante de compilation est nécessaire? Voulez-vous être en mesure de les initialiser avec un calcul fait au moment de l'exécution? Etc.

90voto

Pete Becker Points 27371

Pas de différence ici, mais il est important quand vous avez un type qui a un constructeur.

struct S {
    constexpr S(int);
};

const S s0(0);
constexpr S s1(1);

s0 est une constante, mais il ne promet pas d'être initialisé au moment de la compilation. s1 est marquée constexpr, donc c'est une constante, et, parce qu' Ss'constructeur est également marquée constexpr, il sera initialisé au moment de la compilation.

Surtout, ce qui importe lors de l'initialisation au moment de l'exécution prendrait du temps et que vous voulez pousser ce travail sur le compilateur, où il est aussi beaucoup de temps, mais ne ralentit pas le temps d'exécution du programme compilé

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