57 votes

Quelle est la logique derrière decltype comportement?

Comme je l'ai compris en C++11 decltype(expression) est utilisée pour déduire exactement le même type de l'expression donnée. Mais lorsque l'expression est de mettre en parenthèses, la déduit le type est lvalue de référence pour le type d'expression. Par exemple:

int x;
decltype(x) y = x;

est équivalent à int y = x; mais,

int x;
decltype((x)) y = x;

est équivalent à int& y = x;.

Respectivement

 decltype(auto) f1()
 {
   int x = 0;
   return x; // decltype(x) is int, so f1 returns int
 }

mais

 decltype(auto) f2()
 {
   int x = 0;
   return (x); // decltype((x)) is int&, so f2 returns int&
 }

Quelle est la justification de ce comportement pour être choisi par le comité de la norme?

Postfaces:

Maintenant, j'ai observé que, au moins dans le cas de la GCC 6.2 mise en œuvre lors de l'expression entre parenthèses est plus complexe, par exemple decltype((x + x)) le déduit de type est - T, mais pas T&. C'est encore plus confus. Je ne sais pas si ce comportement est standard.

35voto

Yakk Points 31636

Ils voulaient un moyen d'obtenir le type de déclaration d'un identificateur.

Ils voulaient aussi un moyen d'obtenir le type d'une expression, y compris des informations sur si c'est temporaire ou pas.

decltype(x) donne le type déclaré de l'identificateur x. Si vous passez decltype quelque chose qui n'est pas un identificateur, il détermine le type, puis ajoute & pour lvalues, && pour xvalues, et rien que pour prvalues.

Conceptuellement, vous pouvez la considérer comme la différence entre le type de la variable et le type d'une expression. Mais ce n'est pas tout à fait comment la norme décrit.

Ils pourraient avoir utilisé deux différents mots clés de ces deux choses. Ils n'ont pas.

24voto

Leon Points 20011

Il ya une nécessité pour la discrimination entre une entité et une expression.

Examiner la question suivante:

Quelle est la durée d'Mississippi?

Il y a deux réponses à cette question:

  1. Mississippi est de 2320 km de long.
  2. Mississippi est le 11 lettres.

De même, lorsque vous posez des questions sur le type d' x, et x est un identificateur, il n'est pas clair si tu veux dire que le type qui a été utilisé pour déclarer que l'identificateur (par exemple, le type associé avec le nom de l' x), ou le type de l'expression composée de la seule mention de cet identifiant. En fait, il pourrait y avoir deux différents mots-clés (par exemple, entity_type et expr_type) au lieu d'un seul surchargé decltype. Pour certaines raisons, le comité a choisi de surcharge decltype pour ces deux usages différents.

18voto

Columbo Points 11661

À partir de l'un des auteurs de l' decltype proposition, J. Jarvi:

Ça fait un moment, mais voici ce que j'ai (je pense) n'oubliez pas:

Deux mots-clés pour différencier ces deux types de sémantique n'a jamais été envisagée. (L'introduction de nouveaux mots-clés n'est pas fait à la légère).

Comme pour le changement de la sémantique de l' decltype((x)), discussion dans le de base groupe de travail convergé pour le traitement de l' (x) comme une expression, plutôt qu'un identifiant, qui est peut-être plus de "cohérence interne" avec les règles de la langue.

Les gens étaient au courant que cela pourrait être source de confusion dans certains cas, mais le consensus (tout peut-être pas tout le monde de préférence) a été finalement, pour être conforme à la norme de la définition préalable de qu'est ce qu'un identifiant et ce qui est une expression.

L'exemple que vous avez un lien à [cette question est l'exemple] est en effet surprenant. À l'époque, en déduire une fonction du type de retour de son retour expression à l'aide d' decltype(auto) n'était pas encore partie de la langue, donc je ne pense pas que cette utilisation particulière cas a été sur le radar.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X