Outils pour utilisateurs

Outils du site


lang:cpp:smartptr

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
lang:cpp:smartptr [2024/01/11 17:00] – Ajout de "Différencier empty et expired" rootlang:cpp:smartptr [2025/07/06 16:33] (Version actuelle) – [Préserver l'attribut const sur les pointeurs] : déplacement dans un article dédié root
Ligne 33: Ligne 33:
 </code> </code>
  
-====Préserver l'attribut const sur les pointeurs==== 
-Il faut utiliser ''std::propagate_const<std::unique_ptr<X%%>>%%''. 
- 
-Il existe aussi ''indirect_value'' qui peut se substituer à ''std::propagate_const<std::unique_ptr<X%%>>%%''. Attention, ''indirect_value'' ne permet pas de se substituer à ''std::propagate_const<std::shared_ptr<X%%>>%%'' (voir [[https://github.com/jbcoe/indirect_value/issues/106|Can I replace shared_ptr by indirect_value ?]] {{ :lang:cpp:smartptr:can_i_replace_shared_ptr_by_indirect_value_issue_106_jbcoe_indirect_value_github_18_10_2022_13_27_26_.html |Archive du 04/08/2022 le 18/10/2022}}). 
- 
-Soit la classe commune ''X'' : 
- 
-<code cpp> 
-struct X 
-{ 
-  void g() const { std::cout << "g (const)\n"; } 
-  void g() { std::cout << "g (non-const)\n"; } 
-}; 
-</code> 
- 
-et le programme commun : 
- 
-<code cpp> 
-int main() 
-{ 
-  Y y; 
-  y.f(); 
- 
-  const Y cy; 
-  cy.f(); 
-} 
- 
-</code> 
- 
-  * Cas avec la classe ''X'' intégrée dans une classe ''Y'' avec pointeur classique 
- 
-<code cpp> 
-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; 
-}; 
-</code> 
- 
-Rendu sans surprise : 
- 
-<code> 
-f (non-const) 
-g (non-const) 
-f (const) 
-g (const) 
-</code> 
- 
-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 
- 
-<code cpp> 
-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; 
-}; 
-</code> 
- 
-Rendu : 
- 
-<code cpp> 
-f (non-const) 
-g (non-const) 
-f (const) 
-g (non-const) 
-</code> 
- 
-On ne respecte 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 [[https://github.com/jbcoe/propagate_const|sauf sur GitHub]]. 
- 
-<code cpp> 
-#include <experimental/propagate_const> 
-  std::experimental::propagate_const<std::unique_ptr<X>> m_ptrX; 
-</code> 
- 
-Rendu : 
- 
-<code> 
-f (non-const) 
-g (non-const) 
-f (const) 
-g (const) 
-</code> 
  
 ====Encapsuler fopen/close==== ====Encapsuler fopen/close====
lang/cpp/smartptr.txt · Dernière modification : de root