Voici notre liste de tâches à faire.
Finalement, les entrées deviendront des règles ou des parties de règles.
Sinon, nous déciderons qu’aucun changement n’est nécessaire et nous supprimerons l’entrée.
using dans l’espace de noms global (à l’exception de std et d’autres espaces de noms « fondamentaux » (p. ex. experimental))std::literals::*_literals) ?const devraient être thread‑safe … même si je ne modifie pas réellement la variable, je l’initialise la première fois qu’elle est appelée … arghvoid* devrait se brûler les pieds. C’est un de mes coups de cœur depuis plusieurs années. :)const partout où c’est possible : fonctions membres, variables et (youpi) const_iteratorsauto(size) vs. {initialisateurs} vs. {Extent{size}}std::function) vs. CRTP/static ? OUI. Peut‑être même vs. dispatch par tags ?std::bind, Stephen T. Lavavej le critique tellement que je me demande s’il va effectivement disparaître à l’avenir. Les lambdas doivent‑elles être recommandées à la place ?p = (s1 + s2).c_str();Invalidation de pointeurs/itérateurs entraînant des pointeurs pendants :
void bad() { int* p = new int[700]; int* q = &p[7]; delete p;
vector<int> v(700);
int* q2 = &v[7];
v.resize(900);
// ... use q and q2 ... }
Éviter les membres de classe statiques (conditions de concurrence, variables quasi‑globales)
lock_guard, unique_lock, shared_lock), ne jamais appeler mutex.lock et mutex.unlock directement (RAII)std::terminate est appelé dans le destructeur si le thread n’est pas joint ou détaché … y a‑t‑il une bonne raison de détacher les threads ?) — ??? Une bibliothèque de support pourrait‑elle fournir un wrapper RAII pour std::thread ?std::lock (ou un autre algorithme d’évitement de blocage ?)condition_variable, protégez toujours la condition avec un mutex (un booléen atomique dont la valeur serait modifiée en dehors du mutex est erroné !) et utilisez le même mutex pour la variable de condition elle‑même.atomic_compare_exchange_strong avec std::atomic<user-defined-struct> (les différences de padding comptent, alors que compare_exchange_weak dans une boucle converge vers un padding stable).shared_future individuels ne sont pas thread‑safe : deux threads ne peuvent pas attendre sur le même objet shared_future (ils peuvent attendre sur des copies d’un shared_future qui référencent le même état partagé).Les objets shared_ptr individuels ne sont pas thread‑safe : différents threads peuvent appeler des fonctions membres non‑const sur différents shared_ptr qui référencent le même objet partagé, mais un thread ne peut pas appeler une fonction membre non‑const d’un shared_ptr pendant qu’un autre thread accède à ce même shared_ptr (si vous avez besoin de cela, envisagez atomic_shared_ptr à la place).