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 :

C++0x -> auto?


Sujet :

Langage C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 52
    Points
    52
    Par défaut C++0x -> auto?
    Bonjour à tous !

    Avec l'arrivée du C++0x, et la redéfinition du mot-clef auto, je me suis posé plusieurs questions.

    Est-ce que vous arriverez à indiquer quels sont les types que le compilateurs associent à ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    1) 
    auto i = 0;
     
    2) 
    auto s = "hello";
     
    3) 
    auto a = {1, 2, 3, 4};
     
    4) 
    std::vector<int> v(10);
    auto i = v.begin();
    De plus, je vous demande si vous comptez utiliser ce mot-clef? Et à quel usage? Quels sont clairement ses avantages et ses défauts?

    Merci beaucoup de votre aide !

  2. #2
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Si je ne m'abuse :
    1) int
    2) const char*
    3) std::initializer_list<int>
    4) std::vector<int>::iterator

    Ce ne sont pas vraiment des cas très ambigus.

    Je compte l'utiliser car ça évitera quand on bosse sur du code comportant des templates de se taper toute une ligne pour désigner un type, cf pas mal de codes de Boost.

    Avantage principal : ça facilitera la vie des développeurs C++.
    Inconvénient principal : il se peut que dans des situations très tordues il y ait des conflits etc. Je pense qu'on peut en trouver dans les propositions et rapports concernant 'auto' pour C++0x, dans les papiers du WG21.

  3. #3
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Ces types sont déjà définis par le standard actuel du language:

    1) int par défaut pour les constantes numériques (double pour les flottants)

    2) const char* par défaut pour les string litéraux

    3) 1, 2, 3 et 4 étant de type int, sauf si le prochain standard dis le contraire, ça donne un tableau natif de int : int[4] -- si les types étaient différents par contre je ne sais pas si ça aurait généré un agrégat anonyme (struct?)

    4) std::vector<int>::iterator , qui est le type de l'expression -- instinctif uniquement si on a une connaissance suffisante de la STL.

    Personellement je compte l'utiliser pour des temporaires variables locales de fonctions, pour du code templaté (surtout où on doit utiliser un type dépendant d'un retour de fonction membre d'un type paramettre du template), dans les boucles, dans les lambda, en fait dans tout ce qui est plus ou moins générique (et il me semble que c'est le plus grand interet).

  4. #4
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par Alp
    3) std::initializer_list<int>
    Ah oui tiens j'avais oublié l'ajout de cette classe dans le standard.

  5. #5
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 860
    Points
    11 860
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Ah oui tiens j'avais oublié l'ajout de cette classe dans le standard.
    Bah pour celui-là ça dépend, t'as peut-être raison en fait.

  6. #6
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Xanto Voir le message
    Avec l'arrivée du C++0x, et la redéfinition du mot-clef auto, je me suis posé plusieurs questions.

    Est-ce que vous arriverez à indiquer quels sont les types que le compilateurs associent à ces valeurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    1) 
    auto i = 0;
     
    2) 
    auto s = "hello";
     
    3) 
    auto a = {1, 2, 3, 4};
     
    4) 
    std::vector<int> v(10);
    auto i = v.begin();
    Je vais répondre à ta question par un autre. Soit le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class T> void f(T t) {}
    Quel est le type T de t dans les cas suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    f(0);
    f("hello");
    f({1, 2, 3, 4});
    std::vector<int> v(10);
    f(v.begin());
    La réponse est la même que celle à ta question.
    Citation Envoyé par Xanto Voir le message

    De plus, je vous demande si vous comptez utiliser ce mot-clef? Et à quel usage? Quels sont clairement ses avantages et ses défauts?
    Oui, je l'attends avec impatience. Peut-être pas sur les types de base, mais dès qu'il s'agit de désigner un sous type (un itérateur d'un vecteur, par exemple), sans hésiter.
    De plus, il y a des types qu'il sera difficile de désigner autrement qu'avec auto (ou decltype), comme les lambdas.
    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.

  7. #7
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Alp> Non en fait tu as bien raison, après vérification dans le document N3000 (7.1.6.4) :
    6 Once the type of a declarator-id has been determined according to 8.3, the type of the declared variable
    using the declarator-id is determined from the type of its initializer using the rules for template argument
    deduction. Let T be the type that has been determined for a variable identifier d. Obtain P from T by
    replacing the occurrences of auto with either a new invented type template parameter U or, if the initializer
    is a braced-init-list (8.5.4), with std::initializer_list<U>. The type deduced for the variable d is then
    the deduced type determined using the rules of template argument deduction from a function call (14.9.2.1),
    where P is a function template parameter type and the initializer for d is the corresponding argument. If
    the deduction fails, the declaration is ill-formed. [ Example:
    auto x1 = { 1, 2 }; // decltype(x1) is std::initializer_list<int>
    auto x2 = { 1, 2.0 }; // error: cannot deduce element type
    —end example ]
    Donc ça serait bien initializer_list dans ce cas.

    Du coup JolyLoic je me demande ce que donne

    f({1, 2, 3, 4});
    A priori la réponse ne serait pas la même selon si c'est c++0x ou le standard actuel? (j'essaie de tester avec VC10 mais j'ai un bug bizarre avec, plus moyen d'editer un fichier source O__o)

  8. #8
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Hmm malgrés ce que dis le standard, en testant ceci avec vc10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int wmain()
    {
    	auto test = { 1, 2, 3, 4 };
     
    	return 0;
    }
    J'ai une erreur : error C2078: too many initializers

    Donc dans le doute j'ai ajouté :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include <initializer_list>
    Et là j'ai pas mal d'erreur en rapport avec l'implémentation d'initializer_list en plus de l'erreur précédente. Ca a pas l'air très sec tout ça... Ca donne quoi gcc?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    Pour les types de bases, le sens d'auto est assez limité, c'est clair.

    Cependant, pour ce cas-là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4) 
    std::vector<int> v(10);
    auto i = v.begin();
    Le compilateur arrive à dire si c'est un const_iterator ou un simple iterator?

  10. #10
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Hmm malgrés ce que dis le standard, en testant ceci avec vc10 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int wmain()
    {
    	auto test = { 1, 2, 3, 4 };
     
    	return 0;
    }
    J'ai une erreur : error C2078: too many initializers
    VC10 ne gère pas les nouvelles possibilités d'initialisation...
    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.

  11. #11
    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 : 49
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par Xanto Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::vector<int> v(10);
    auto i = v.begin();
    Le compilateur arrive à dire si c'est un const_iterator ou un simple iterator?
    Il s'agit d'un iterator, et non d'un const_iterator. De même, si tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vector<int>::const_iterator i = v.begin();
    begin retourne quand même un iterator, qui se trouve ensuite converti en const_iterator. Le seul moyen que begin retourne un const_iterator est qu'il soit appelé sur un objet constant.
    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.

  12. #12
    Membre expérimenté Avatar de alexrtz
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2003
    Messages
    639
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2003
    Messages : 639
    Points : 1 359
    Points
    1 359
    Par défaut
    Citation Envoyé par Klaim Voir le message
    Ca donne quoi gcc?
    Ça passe
    "Je suis incapable d'expliquer ce qui se passa ensuite : je lâchai quelque chose, quelque chose à quoi je m'agrippais depuis toujours sans m'en rendre compte. Je m'enfonçais dans une obscurité chaude, moelleuse et protectrice, tandis qu'un loup montait la garde par mes propres yeux."

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2006
    Messages : 58
    Points : 52
    Points
    52
    Par défaut
    En ce qui concerne les templates pour le nouveau standard :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <iostream>
     
    template<typename T>
    void f(T t)
    {
    	cout << t.size() << endl;
    }
     
    int main()
    {
    	f({1,2,3,4});
     
    	return 0;
    }
    En compilant avec GCC 4.4.2, j'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    g++ --std=c++0x auto.cpp -o auto
    auto.cpp: In function ‘int main()’:
    auto.cpp:19: attention : deducing ‘T’ as ‘std::initializer_list<int>’
    auto.cpp:12: attention :   in call to ‘void f(T) [with T = std::initializer_list<int>]auto.cpp:19: attention :   (you can disable this with -fno-deduce-init-list)
    C'est donc bel et bien convertit en initializer_list.

    Merci beaucoup à vous tous. Je suis très content de la qualité de vos réponses, c'est exactement ce que je voulais savoir. C'est très sympa.

    Le sujet est résolu. (à moins qu'il y ait plus de choses à savoir sur le mot-clef auto)

  14. #14
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Bien sûr qu'il y a d'autres choses à savoir sur le mot-clé auto.
    Il enlève les références.
    Boost ftw

  15. #15
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Tu veux dire que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class Machin{ /*...*/ };
     
    Machin& test() { /*...*/ }
     
    //...
     
    auto k = test();
    k est de type Machin et non Machin& ?

  16. #16
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Oui, mais tu peux avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    auto& k = test(); // k : Machin&
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  17. #17
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    Subtilité qui peut s'avérer importante dis donc... merci de l'info!

  18. #18
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    La régle est calqué sur celle de la déduction des arguments templates .

    (la problématique était posé en cas de polymorphisme, notamment)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  19. #19
    Membre expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Points : 3 344
    Points
    3 344
    Par défaut
    C'est ce que j'ai compris, mais j'imagine aussi tous les cas de perte de performance où des débutants utiliseraient auto a tout va et se retrouveraient avec des copies en pagaille...(avec ou sans code template)

    Cela dit, dans le cas que j'ai décris, NRVO sera mis en pratique non?

  20. #20
    Invité
    Invité(e)
    Par défaut
    En D on exactement le même auto, c'est pratique quand on a la flemme de taper le type d'une variable locale, au prix d'une certaine lisibilité. J'ai tendance à le mettre un peu partout.

    Donc je suis bien content qu'il passe dans C++.

Discussions similaires

  1. [sgbd] Backup de tables MySQL auto, qqun sait ???
    Par Joelindien dans le forum SGBD
    Réponses: 31
    Dernier message: 26/05/2003, 18h59
  2. Pb d'auto-incrément sur une table v7
    Par Nivux dans le forum Paradox
    Réponses: 9
    Dernier message: 26/12/2002, 13h05
  3. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 01h10
  4. Un Sender peut-il s'auto-détruire lors d'un onClick?
    Par Flo. dans le forum C++Builder
    Réponses: 2
    Dernier message: 17/07/2002, 11h31
  5. Réponses: 8
    Dernier message: 17/05/2002, 10h08

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