Pour définir des constantes de compilation de l'ensemble des types comme suit (à la fonction et la portée de classe), dont la syntaxe est la meilleure?
static const int kMagic = 64; // (1)
constexpr int kMagic = 64; // (2)
(1)
travaille aussi pour C++98/03 compilateurs, au lieu (2)
nécessite au moins C++11. Existe-il d'autres différences entre les deux? Si l'un ou l'autre être préféré moderne de code C++, et pourquoi?
MODIFIER
J'ai essayé cet exemple de code avec Godbolt du CE:
int main()
{
#define USE_STATIC_CONST
#ifdef USE_STATIC_CONST
static const int kOk = 0;
static const int kError = 1;
#else
constexpr int kOk = 0;
constexpr int kError = 1;
#endif
return kOk;
}
et pour l' static const
des cas c'est l'assembly généré par GCC 6.2:
main::kOk:
.zero 4
main::kError:
.long 1
main:
push rbp
mov rbp, rsp
mov eax, 0
pop rbp
ret
D'autre part, pour constexpr
il est:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 0
mov DWORD PTR [rbp-8], 1
mov eax, 0
pop rbp
ret
Bien qu'à l' -O3
dans les deux cas, je reçois le même (optimisé) de l'assemblée:
main:
xor eax, eax
ret
EDIT #2
J'ai essayé ce code simple (en direct sur Ideone):
#include <iostream>
using namespace std;
int main() {
const int k1 = 10;
constexpr int k2 = 2*k1;
cout << k2 << '\n';
return 0;
}
ce qui montre que const int k1
est évaluée au moment de la compilation, comme il est utilisé pour calculer le constexpr int k2
.
Cependant, il semble y avoir différents comportements pour double
s. J'ai créé une autre question pour que ici.