lang:cpp:smartptr
Ceci est une ancienne révision du document !
std::weak_ptr en tant que clé dans un conteneur
Il faut utiliser le comparateur owner_less
.
std::map<U, T, std::owner_less<U>> destination;
Préserver l'attribut const sur les pointeurs
Il faut utiliser propagate_const
.
Soit la classe commune X
:
struct X { void g() const { std::cout << "g (const)\n"; } void g() { std::cout << "g (non-const)\n"; } };
et le programme commun :
int main() { Y y; y.f(); const Y cy; cy.f(); }
Cas avec la classe ''X'' intégrée dans une classe ''Y'' avec pointeur classique
struct Y { Y() { } void f() const { std::cout << "f (const)\n"; m_ptrX.g(); } void f() { std::cout << "f (non-const)\n"; m_ptrX.g(); } // Ici, X est une instance sans pointeur. X m_ptrX; };
Rendu sans surprise :
f (non-const) g (non-const) f (const) g (const)
Si la méthode f const
est appelée, la méthode g const
est appelée également car une méthode const
ne peut pas appeler une méthode non const
.
Cas avec un pointeur intelligent
struct Y { Y() : m_ptrX{} { } void f() const { std::cout << "f (const)\n"; m_ptrX->g(); } void f() { std::cout << "f (non-const)\n"; m_ptrX->g(); } std::unique_ptr<X> m_ptrX; };
Rendu :
f (non-const) g (non-const) f (const) g (non-const)
On ne respecte la l'obligation d'appeler des méthodes const
depuis une méthode const
.
Cas avec un pointeur unique et propagate_const
Prérequis : minimum clang 3.9, gcc 6.1. Pas dans Visual Studio 2017 sauf sur GitHub.
#include <experimental/propagate_const> std::experimental::propagate_const<std::unique_ptr<X>> m_ptrX;
Rendu :
f (non-const) g (non-const) f (const) g (const)
lang/cpp/smartptr.1622495315.txt.gz · Dernière modification : 2021/05/31 23:08 de root