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 confirmé
    [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

    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

    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
    > 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

    Bonjour,
    Ok je m'occupe de la mise en œuvre de vos propositions.
    Je vous reviendrai pour les différentes relectures

    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.