[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 :
Citation:
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 :
Citation:
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 :
Citation:
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 :
Citation:
C++11
L'entête <string> contient toutes les fonctions dont vous avez besoin :
Code:
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 :
Citation:
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 :
Citation:
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 :
Citation:
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
Citation:
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 :
Citation:
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 :
Citation:
C++11
En C++11, à la place du
copy and swap, préférez le
copy and move :
Code:
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 :
Citation:
C++11
Oui. Par exemple, on peut écrire :
Code:
1 2
| template<class T> using Tableau = std::vector<T>;
Tableau<int> tab; // équivaut à "std::vector<int> tab;" |