Outils pour utilisateurs

Outils du site


lang:cpp:variable

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
Prochaine révision
Révision précédente
lang:cpp:variable [2021/11/05 23:23] – Ajout de "non-const lvalue reference to type" rootlang:cpp:variable [2025/07/28 10:36] (Version actuelle) – Précision sur l'utilisation de la lambda dans "Initialisation complexe d'une constante" root
Ligne 1: Ligne 1:
 ====Déclaration des variables==== ====Déclaration des variables====
 +===Pointeur sur méthode vs std::function===
 +
 +''std::function'' supporte les lambda avec des captures, la syntaxe C ne supporte que la capture du ''this''.
 +
 +De même, il faut préfixer par un ''+'' une lambda pour la forcer à être interprété comme un pointeur avec la syntaxe C. Nécessite uniquement si la déclaration de la variable pointeur sur fonction est de type ''auto''.
 +
 +<code cpp>
 +#include <type_traits>
 +
 +int main() {
 +  auto funcPtr = +[] {};
 +  static_assert(std::is_same<decltype(funcPtr), void (*)()>::value);
 +  void (*funcPtr2)() = [] {};
 +  static_assert(std::is_same<decltype(funcPtr2), void (*)()>::value);
 +  // funcPtr3 est un std::function.
 +  auto funcPtr3 = [] {};
 +  // error: static assertion failed
 +  static_assert(std::is_same<decltype(funcPtr3), void (*)()>::value);
 +}
 +</code>
 +
 +[[https://www.cppstories.com/2020/08/c-lambda-week-some-tricks.html/#heading|+[]()]] {{ :lang:cpp:variable:lambda_week_tricks_-_c_stories_7_28_2025_10_28_36_am_.html |Archive du 07/08/2020 le 28/07/2025}}
 +
 ===Pointeur sur la méthode d'une classe=== ===Pointeur sur la méthode d'une classe===
  
Ligne 18: Ligne 41:
  
 [[https://stackoverflow.com/questions/17874489/disambiguate-overloaded-member-function-pointer-being-passed-as-template-paramet|Disambiguate overloaded member function pointer being passed as template parameter]] {{ :lang:cpp:variable:c_-_disambiguate_overloaded_member_function_pointer_being_passed_as_template_parameter_-_stack_overflow_2021-05-29_08_00_38_.html |Archive du 26/07/2013 le 29/05/2021}} [[https://stackoverflow.com/questions/17874489/disambiguate-overloaded-member-function-pointer-being-passed-as-template-paramet|Disambiguate overloaded member function pointer being passed as template parameter]] {{ :lang:cpp:variable:c_-_disambiguate_overloaded_member_function_pointer_being_passed_as_template_parameter_-_stack_overflow_2021-05-29_08_00_38_.html |Archive du 26/07/2013 le 29/05/2021}}
-====Programmation fonctionnelle==== 
  
-===Initialisation complexe d'une constante===+===Pointeur de pointeur===
  
-Plutôt que+<code cpp> 
 +struct Z { 
 +  int z; 
 +};
  
-{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_bad.cpp}}+struct A { 
 +  Z* i; 
 +};
  
-écrire+struct B { 
 +  A a; 
 +};
  
-{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_good.cpp}}+int main() { 
 +  auto ptr1 = &B::a; 
 +  auto ptr2 = &A::i;
  
-====Erreurs====+  B b;
  
-  * ''non-const lvalue reference to type 'X<...>' cannot bind to a temporary of type 'X<...>%%'%%''+  // Bien mettre les parenthèses 
 +  int z = (b.*ptr1.*ptr2)->z; 
 +
 +</code>
  
-Parfois, il n'est pas possible de faire:+===Variable optionnelle=== 
 + 
 +Création une variable ''field'' de type ''void*'' si ''T'' est de type ''int''.
  
 <code cpp> <code cpp>
-int i; +std::conditional_t<std::is_integral_v<T>, int, void*> field;
-int& j = i;+
 </code> </code>
  
-Il faut alors soit passer par une référence constante :+====Programmation fonctionnelle====
  
-<code cpp> +===Initialisation complexe d'une constante===
-int i; +
-const int& j i; +
-</code>+
  
-ou passer par un pointeur :+Plutôt que
  
-<code cpp> +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_bad.cpp}} 
-int i; + 
-int* j = &i; +écrire 
-</code>+ 
 +{{gh>https://github.com/bansan85/wiki_le_garrec_fr/blob/master/cpp/variable/const_variable_good.cpp}} 
 + 
 +<WRAP center round info 60%> 
 +Bien noter que la lambda est exécutée tout de suite avec un ''()'' juste après sa déclaration. 
 +</WRAP>
  
-[[https://stackoverflow.com/questions/18565167/non-const-lvalue-references|Non const lvalue references]] {{ :lang:cpp:variable:c_-_non_const_lvalue_references_-_stack_overflow_2021-11-05_23_19_03_.html |Archive du 02/09/2013 le 05/11/2021}} 
lang/cpp/variable.1636151002.txt.gz · Dernière modification : de root