3 votes

Pourquoi la règle de l'odr-use (utilisation de la règle d'une définition) dépend-elle du contexte ?

É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 ?

4voto

T.C. Points 22510

Pourquoi l'utilisation odr dépend-elle du contexte?

Non. square(A::a) utilise odr A::a, point final.

Cependant, la plupart des violations de l'ODR ne sont pas tenues d'être diagnostiquées, et celui-ci ne fait pas exception.

Le compilateur ne devrait-il pas évaluer cette fonction à la compilation dans les deux cas?

L'initialiseur d'une variable constexpr doit être évalué à la compilation. (Eh bien, pas tout à fait, mais le compilateur doit l'évaluer jusqu'au point où il peut déterminer qu'il s'agit d'une expression constante valide, à ce stade, autant qu'il fasse le travail complet.) Pour une variable locale non-constexpr, il n'y a aucune garantie de ce genre.

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