Maison  >  Article  >  développement back-end  >  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
Patricia Arquetteoriginal
2024-10-31 11:15:29833parcourir

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>

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:
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