Maison > développement back-end > C++ > Pourquoi l'utilisation de doubles parenthèses dans « decltype » modifie-t-elle le type résultant ?

Pourquoi l'utilisation de doubles parenthèses dans « decltype » modifie-t-elle le type résultant ?

Patricia Arquette
Libérer: 2024-10-31 11:15:29
original
893 Les gens l'ont consulté

Why Does Using Double Parentheses in `decltype` Change the Resulting Type?

Déduction de type avec doubles parenthèses dans decltype

En C , le mot-clé decltype peut être utilisé pour déterminer le type d'une expression. Lorsqu'il est utilisé avec des parenthèses doubles, il présente un comportement subtil qui peut prêter à confusion.

Problème :

Considérez l'extrait de code suivant :

<code class="cpp">const int&&& foo();
int i;
struct A { double x; };
const A* a = new A();
decltype(foo()) x1 = i;     // type is const int&&&
decltype(i) x2;             // type is int
decltype(a->x) x3;          // type is double
decltype((a->x)) x4 = x3;   // type is const double&</code>
Copier après la connexion

Pourquoi l'ajout de parenthèses à a->x dans la quatrième ligne change-t-il le type résultant de double en const double& ?

Réponse :

L'explication réside dans les règles de déduction des types à l'aide de decltype. Selon le standard du langage C :

  1. Si e est un identifiant sans parenthèses ou un accès membre de classe, decltype(e) renvoie le type de l'entité nommée par e.
  2. Si e est une lvalue, decltype(e) renvoie T&, où T est le type de e.

Dans l'exemple donné :

  • decltype(a->x) interprète a->x comme un accès membre de classe, ce qui donne un type de double.
  • decltype((a->x)) interprète (a->x) comme une lvalue, ce qui donne un type de const double&.

Par conséquent, l'ajout de parenthèses à a->x modifie la déduction de type du type du membre accédé à une référence au membre lui-même.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal