C ++ 11: 02 mot-clé decltype

decltype

0. Spectacle pré-classe

  • Obtenez le "Type déclaré" de l'expression, ainsi nomméedecltpe
  • Pensée: similitudes et différences entre typeid et decltype
    • typeidUtilisé pour renvoyer le type réel de l'objet pointé par le pointeur ou la référence.

1. Connaître le type d'expression

  • Dérivez le type d'une expression au moment de la compilation , reportez-vous àsizeof
  • Comprendre le code suivant
int x = 0;
decltype(x) y = 1;  //y -> int
decltype(x+y) z = 0; //z->int

const int& i = 1;
decltype(i) j = y; //j -> const int &

const decltype(z) *p = &z;  //*p -> const int, p->const int *
decltype(z)* pi = &z;  // *pi ->int, pi->int*
decltype(pi)* pp = π // *pp ->int*, pp->int**

2. Les règles de dérivation du decltype

  • Règle 1: exp est un identifiant, l'expression d'accès à une classe, decltype (exp) et exp ont le même type.
    • int i = 0; decltype(i) x = 0;
  • Règle 2: exp est un appel de fonction, le type de decltype (exp) et la valeur de retour sont les mêmes
    • int add(int ,int ); decltype(add());
  • Règle 3: Dans d'autres cas, si exp est une valeur l, alors decltype (exp) est une référence lvalue de type exp, sinon elle est cohérente avec le type exp.
struct Foo {int x;};
decltype(foo.x) a = 0; // a->int
// 左值就是左值引用,右值,就是原类型
decltype((foo.x)) b = a; // b->const int &  

3. L'application pratique du decltype

  • Débutants, peu d'expérience
  • L'auteur ne comprend pas les exemples , mais je pense à un exemple, somme (T1 x, T2 y), dont la question est utilisée pour la valeur de retour, et peut maintenant être déduite par type.

4. Autres points de connaissance

  • Lors de l'utilisation de decltype pour la dérivation, ses membres n'hériteront pas de qualificatifs const ou volatiles .

5. Résumé

  • Dans la programmation non générique, nous n'avons pas besoin de déduire les types, car les types de variables dans n'importe quelle expression sont clairs, et les opérations, appels de fonction, etc. ont également des types de retour clairs. En programmation générique, le type devient inconnu .
    • add (T a1, Y a2);//两个不同的类型,add()的返回值类型怎么写?Dans ce cas, une dérivation de type s'est produite.
  • Similitudes et différences entre decltype et auto

Lisez-moi

  • 1. La première édition de 20200420: se référer au contenu du 1.1.2 de "Application approfondie de C ++ 11"
    • La section 3 «Application pratique» n'est pas bien comprise

Je suppose que tu aimes

Origine www.cnblogs.com/fewolflion/p/12747397.html
conseillé
Classement