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

Contribuez C++ Discussion :

[FAQ] Prise en compte du C++11


Sujet :

Contribuez C++

  1. #1
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 460
    Points : 6 064
    Points
    6 064
    Par défaut [FAQ] Prise en compte du C++11
    Bonjour.

    Il y a quelques jours, j'ai lu presque intégralement la FAQ C++.
    J'ai constaté qu'il y avait certains couples question-réponse qui prenaient en compte le C++11, par exemple celui-ci :

    Un constructeur d'une classe peut-il appeler un autre constructeur de la même classe pour initialiser 'this' ?

    C++11

    Notez que C++11 permet maintenant au constructeur d'une classe de faire directement appel à un autre constructeur. Cette technique s'appelle le delegating constructor.

    C++03

    Absolument pas.

    Prenons un exemple. [...]
    Mais ce n'était pas le cas de tous. Alors, je me suis inscrit ici pour proposer quelques modifications de la FAQ.
    J'ai aussi des propositions de correction qui ne concernent pas le C++11, mais je pense que je les mettrai dans un autre fil car le fil présent sera déjà assez chargé.

    C'est parti.

    Quelle est la différence entre string::data() et string::c_str() ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...t-string-c-str

    Je propose d'ajouter au début :

    C++11

    string::c_str() et string::data() sont synonymes et retournent un pointeur vers un tableau de caractères, interne à std::string, qui contient le caractère nul.
    Quelles précautions faut-il prendre avec string::c_str() et string::data() ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...et-string-data

    Certaines précautions vraies en C++03 ne sont plus valables en C++11.

    Je propose d'ajouter au début :

    C++11

    string::c_str() et string::data() sont synonymes et retournent un pointeur vers un tableau de caractères, interne à std::string, qui contient le caractère nul.
    La précaution à prendre est que le pointeur retourné par ces fonctions peut ne plus être valable suite à une modification ou une suppression de l'objet std::string.
    Comment convertir un nombre en une string ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...-en-une-string

    Je propose d'ajouter au début :

    C++11

    L'entête <string> contient toutes les fonctions dont vous avez besoin :
    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
    string to_string (int val);
    string to_string (long val);
    string to_string (long long val);
    string to_string (unsigned val);
    string to_string (unsigned long val);
    string to_string (unsigned long long val);
    string to_string (float val);
    string to_string (double val);
    string to_string (long double val);
    wstring to_wstring (int val);
    wstring to_wstring (long val);
    wstring to_wstring (long long val);
    wstring to_wstring (unsigned val);
    wstring to_wstring (unsigned long val);
    wstring to_wstring (unsigned long long val);
    wstring to_wstring (float val);
    wstring to_wstring (double val);
    wstring to_wstring (long double val);
    Quel conteneur choisir pour stocker mes objets ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...ker-mes-objets

    On peut lire :
    On peut aussi trouver dans certaines versions de la STL d'autres conteneurs, non standards mais bien connus : tables de hachage, listes simplement chaînées, etc. Leur utilisation est généralement similaire à celle des autres conteneurs standards, mais pensez tout de même à bien vous documenter avant de les utiliser !
    Il faudrait supprimer ce paragraphe, car de tels conteneurs ont bien été ajoutés à la bibliothèque standard.

    Je propose d'ajouter à la fin :

    C++11

    De nouveaux conteneurs sont apparus dans la bibliothèque standard :
    - std::array : tableau de taille fixe connue à la compilation
    - std::unordered_set : ensemble implémenté sous la forme d'une table de hachage. Chaque élément n'apparaît qu'une fois.
    - std::unordered_multiset : collection implémentée sous la forme d'une table de hachage. Chaque élément peut apparaitre plusieurs fois.
    - std::unordered_map : tableau associatif implémenté sous la forme d'une table de hachage. A chaque clé correspond une seule valeur.
    - std::unordered_multimap : tableau associatif implémenté sous la forme d'une table de hachage. A chaque clé correspond une ou plusieurs valeurs.
    - std::forward_list : liste simplement chaînée
    - std::unique_ptr<T[]> : La spécialisation pour les tableaux de std::unique_ptr libère les ressources avec delete[]. Si la taille du tableau est connue à la compilation, préférez std::array. Si le tableau a besoin d'être redimensionné, préférez std::vector.
    Pourquoi ne faut-il qu'un seul return par fonction ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...n-par-fonction

    On peut lire :
    Et si l'on est obligé d'allouer avec new, C++ nous offre là encore un moyen simple de gérer cela, std::auto_ptr
    Et pour les objets alloués avec new[] ? C++ ne fournit pas en standard de moyen... sauf d'utiliser plutôt std::vector !
    La dernière phase citée est valable en C++03 mais fausse en C++11.

    Je propose d'ajouter au début :

    C++11

    Préférez std::unique_ptr à std::auto_ptr. Notez qu'il existe une spécialisation de std::unique_ptr pour les tableaux qui libère les ressources avec delete[].
    Comment écrire un opérateur d'affectation correct ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...tation-correct

    Ce lien conseille d'utiliser le copy and swap.

    Je propose d'ajouter à la fin :

    C++11

    En C++11, à la place du copy and swap, préférez le copy and move :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MaClasse& MaClasse::operator =(MaClass Other) // passage par valeur
    { 
        *this = std::move(Other); // nécessite de définir au préalable l'affectation de mouvement
        return *this; 
    }
    Peut-on créer un alias (typedef) sur des templates ?

    Lien : http://cpp.developpez.com/faq/cpp/?p...-des-templates

    La réponse actuelle dit que non.

    Je propose d'ajouter au début :

    C++11

    Oui. Par exemple, on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<class T> using Tableau = std::vector<T>;
    Tableau<int> tab; // équivaut à "std::vector<int> tab;"

  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 : 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
    Je suis d'accord avec toutes tes propositions.

    Pour "Pourquoi ne faut-il qu'un seul return par fonction ?", j'aurais envie de supprimer toute référence à auto_ptr, même en C++98/03... c'est vraiment trop piégeux...

    Après, je me demande s'il n'est pas temps de réécrire toute la FAQ avec C++11 par défaut (ça fait 5 ans que c'est sorti, tous les compilos récents l'implémentent assez correctement), quitte à mentionner des trucs spécifique à C++98 par moment...
    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
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 826
    Points : 218 287
    Points
    218 287
    Billets dans le blog
    117
    Par défaut
    Pour une FAQ C++11 . Je serai là, pour tout support avec l'outil, ou des relectures (ou autre besoin). Enfin, pour aider à l'élaboration de la FAQ
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  4. #4
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    > Comment convertir un nombre en une string ?

    J'imagine qu'il faudrait alors aussi mettre à jour chaine -> nombre. Et si on liste les nouvelles fonctions, pour l'enchainement, je rajouterai quelque chose du genre.
    "Si vous avez besoin de conversions génériques, vous pourrez toujours vous rabattre sur la façon de faire pré-C++11, i.e." ...

    > Pourquoi ne faut-il qu'un seul return par fonction ?

    Quitte à parler d'unique_ptr, il faudrait aussi introduire make_unique & cie.
    Ce qui me fait penser qu'un des premiers chapitres du cours C++ "révisions" que je donne présente des alternatives à "T*f()" et "f(T*)" selon que la fonction offre une consultation/consulte ou est une source/puit, ou s'il y a des optionnels au milieu. Je ne sais plus si ce genre de question est traité dans la FAQ

    > Comment écrire un opérateur d'affectation correct ?

    Pour le copy-and-move, il va falloir plus de matériel. A commencer par écrire un constructeur de déplacement qui n'utilise pas swap. Parler éventuellement du double-move introduit. Et aussi un rappel au sujet de l'exception safety et l'auto-affectation-safety. Accessoirement, cette version de l'affectation n'est pas garantie noexcept, ce qui peut pénaliser certains algorithmes qui en profiteraient -- je pensais au vecteurs, mais je ne sais plus s'il attend la garantie noexcept sur le constructeur de déplacement ou sur l'opérateur d'affectation par déplacement.

    Sur le sujet des déplacements, il faudrait (si cela n'y est pas déjà) un "quand a-t-on besoin d'écrire les opérations de déplacements", qui doit introduire la notion de partie immergée VS émergée de l'iceberg (je crois que Koenig avait un ou deux articles à ce sujet dans feu DrDobb's Journal.)
    En notion connexe, il y a la règle du 0, voire celle du tout ou rien que j'avais bien aimée (http://arne-mertz.de/2015/02/the-rul...ll-or-nothing/).

    > Peut-on créer un alias (typedef) sur des templates ?
    Sur le sujet, un des exemples les plus percutant est je trouve:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <typename T>
    using whatever_t = typename whatever<T>::type;
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Points : 13 061
    Points
    13 061
    Par défaut
    Bonjour,
    Ok je m'occupe de la mise en œuvre de vos propositions.
    Je vous reviendrai pour les différentes relectures

    Pour contacter les différents services du club (publications, partenariats, publicité, ...) : Contacts

Discussions similaires

  1. [netbeans] Modifications non prises en compte
    Par nadass dans le forum NetBeans
    Réponses: 6
    Dernier message: 07/04/2005, 14h49
  2. Lecture de fichier - dernière ligne non prise en compte
    Par JulienPles dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 16/03/2005, 12h57
  3. Prise en compte des contraintes
    Par potanie dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 05/11/2004, 11h00
  4. [MFC]: prise en compte du clavier
    Par ben_iap dans le forum MFC
    Réponses: 8
    Dernier message: 20/01/2004, 16h00

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