IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

constexpr et std::min


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut constexpr et std::min
    Bonjour à tous,

    Le code suivant ne compile pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct A
    {
        static constexpr int a = 42;
    };
     
    int main()
    {
        return std::min(A::a, 12);
    }
    Avec l’erreur suivante :
    undefined reference to `A::a'
    Bon, de ce que je comprends, c’est lié au passage par référence constante.

    Toutefois, je ne comprends pas (note : ce n’est pas lié au constexpr, ça fait pareil avec un const simple). Je pensais qu’il était parfaitement valide d’initialiser les variables statiques de type int dans la classe. Or, je constate que oui, c’est valide, mais que la variable est déclarée, a une valeur, mais pas d’adresse .

    Le comportement est le même avec gcc et clang, ce qui incite à penser que c’est normal. Pourtant, je ne peux pas m’empêcher de trouver ça particulièrement tordu.

    D’autres avis / explications ?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    http://cpp.developpez.com/faq/cpp/?p...SS_init_static

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <iostream>
    using namespace std;
     
     
    struct A
    {
        static constexpr int a = 42;
    };
     
    constexpr int A::a;
     
    int main()
    {
        std::cout<<std::min(A::a, 12)<<std::endl;
        std::cout<<std::min(A::a, 666)<<std::endl;
        return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    La FAQ dit bien :

    il existe un raccourci pour les variables statiques entières constantes, voir Que signifie la déclaration suivante : 'static const int MAX = 10' ?
    Et c’est bien ce qui m’ennuie ici.

    Le « raccourci » n’est pas équivalent, en fait.

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Bon, je me réponds à moi-même, je suis allé regarder la norme :

    § 9.4.2
    If a static data member is of const literal type, its declaration in the class definition can specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression.
    A static data member of literal type can be declared in the class definition with the constexpr specifier; if so, its declaration shall specify a brace-or-equal-initializer in which every initializer-clause that is an assignment-expression is a constant expression. [ Note: In both these cases, the member may appear in constant expressions. — end note ] The member shall still be defined in a namespace scope if it is odr-used (3.2) in the program and the namespace scope definition shall not contain an initializer.
    La dernière phrase est celle qui est importante ici, même si je ne comprends pas tout ce qu’elle veut dire…

  5. #5
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    constexpr implique const, mais pas trop quand même.
    Preuve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    #include <iostrema>
    using namespace std;
     
    struct A
    {
        static constexpr const int a = 42;
    };
     
     
    int main()
    {
        std::cout<<std::min(A::a, 12)<<std::endl;
        std::cout<<std::min(A::a, 666)<<std::endl;
        return 0;
    }
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Tu compiles avec quel compilateur ? Visual ?

    Chez moi, j’ai bien l’erreur de lien avec gcc (4.7.2 ou 4.8.1) et clang (3.0 et 3.2)

Discussions similaires

  1. Hebergement jsp servlets(gratuit pour un espace min)
    Par Gandalf_new dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 09/01/2010, 05h04
  2. Équivalent de std::min et std::max en C?
    Par vdumont dans le forum C
    Réponses: 2
    Dernier message: 08/10/2006, 18h15
  3. [Algo] Convertir un entier en HH:min:ss
    Par Thomas Lebrun dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 26/02/2004, 23h57
  4. std MFC
    Par philippe V dans le forum MFC
    Réponses: 7
    Dernier message: 17/01/2004, 00h54
  5. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo