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 :

Les parenthèses et la norme C++


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut 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
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    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 éprouvé
    Étudiant
    Inscrit en
    Octobre 2007
    Messages
    189
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2007
    Messages : 189
    Par défaut
    Merci beaucoup pour cette réponse complète! Tout est limpide maintenant. =)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [RegEx] Vérifier les parenthèses
    Par moukit233 dans le forum Langage
    Réponses: 11
    Dernier message: 11/02/2010, 18h59
  2. ignorer les parenthèses
    Par wissem.ba dans le forum ASP.NET
    Réponses: 2
    Dernier message: 24/02/2009, 18h43
  3. marquer les accolades et les parenthèse
    Par imad_eddine dans le forum Visual Studio
    Réponses: 5
    Dernier message: 09/08/2007, 16h58
  4. Petite erreur concernant les parenthèses
    Par bugland dans le forum Langage
    Réponses: 14
    Dernier message: 04/01/2007, 10h21
  5. [Regex] Comment gérer les parenthèses ?
    Par davcha dans le forum Framework .NET
    Réponses: 7
    Dernier message: 27/03/2006, 14h28

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