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 :

Les parenthèses et la norme C++


Sujet :

Langage C++

  1. #1
    Membre actif
    Les parenthèses et la norme C++
    Bonjour/Bonsoir,

    nous avons dernièrement rencontré un phénomène "intéressant" du language C++ qui nous a causé par mal de bug.

    Le problème est illustré avec le code suivant :


    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #include <iostream>
     
    class SomeClass {
     
    public:
        // Quelques constructeurs...
        SomeClass(int, int, int) { std::cout << "3 int" << std::endl; }
        SomeClass(int, int) { std::cout << "2 int" << std::endl; } 
        SomeClass(int) { std::cout << "1 int" << std::endl; }
    };
     
    // Et une petite fonction.
    void foo(SomeClass) { std::cout << "bar" << std::endl; }
     
    int main (int argc, const char * argv[])
    {
                                    // Affichage :
        SomeClass o3(0, 0, 0);      // 3 int
        SomeClass o2(0, 0);         // 2 int
        SomeClass o1(0);            // 1 int
     
        SomeClass p3 = (0, 0, 0);   // 1 int
        //              ^ expression result unused
     
        foo((0, 0));                // 1 int \n bar
        //   ^ expression result unused
        return 0;
    }


    Les 'expression result unused' sont donnés par le compilateur avec les bonnes options de compilation pour les warnings.

    Je me demandais si l'un d'entre vous saurais m'indiquer quelle section de la norme explique ce comportement.

    Merci d'avance à vous pour assouvir ma curiosité! :-)

  2. #2
    Rédacteur/Modérateur

    Tout n'est pas rassemblé dans un seul point...

    Tu en as une partie dans 5.18, qui explique l'operator,, et dans 8.5 qui décrit la forme d'un initializer.

    Cette section a pas mal changé entre C++98 et C++11, avec l'introduction d'une syntaxe d'initialisation plus propre et puissante (en gros, dans on cas, tu aurais pu écrire SomeClass o3{0, 0, 0}; ou SomeClass o3 = {0, 0, 0}; ou foo({0, 0, 0}); et les trois auraient marché).

    En C++98, si tu utilises la syntaxe avec =, tu n'as le droit qu'à une seule valeur pour initialiser, donc il considère (0,0,0) non pas comme 3 valeurs d'init, mais comme une expression à évaluer, avec des parenthèses inutiles entourant deux utilisation de l'opérateur virgule.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre actif
    Merci beaucoup pour cette réponse complète! Tout est limpide maintenant. =)

###raw>template_hook.ano_emploi###