Étant donné le morceau de code suivant :
#include
struct A {
static constexpr float a = 2.0f;
};
// référence non constante pour le rendre plus explicite - même comportement
template constexpr inline T square(T& x)
{
return x * x;
}
int main() {
/*constexpr*/ float val = square(A::a);
std::cout << val;
}
Ce programme échoue à lier avec undefined reference to 'A::a'
(toujours avec clang, uniquement avec -O0 avec g++), cependant il se lie correctement si je commente le constexpr
de la déclaration de val
.
Jusqu'à présent, je comprends que constexpr
ne peut pas être utilisé odr sans une définition explicite dans l'un des fichiers d'unité, mais je ne comprends pas pourquoi cela fonctionne lorsqu'on affecte au constexpr
.
Il semble que ces deux cas soient traités différemment en fonction du contexte. Mais pourquoi ? Le compilateur ne devrait-il pas simplement évaluer cette fonction à temps de compilation dans les deux cas ?