8
votes

Quel est le point du mot clé 'auto'?

Je comprends donc en utilisant var in c # a du sens car vous avez des types anonymes qui sont dérivés du compilateur. C ++ ne semble pas avoir cette fonctionnalité (sauf si je me trompe), alors quel est le point d'avoir un mot-clé

(c'est un peu cool que contrairement à C #, auto fonctionne pour les variables de membre / globales, qui est cool je suppose, mais ne semble pas suffisamment pour justifier son existence).


11 commentaires

Je ne décrirais pas var en utilisant "les types anonymes du compilateur dérivé" tant que l'élimination des déclarations de type redondantes / douloureuses * pour le développeur. * Voir Linq Edit: Oh, attendez, oui, vous pouvez l'utiliser pour les types anonymes. Ne pas tenir compte de moi. :)


C'est vraiment la seule fois où vous avez utiliser var . Il vous suffit d'utiliser var dans une expression LINQ lorsque le résultat est anonyme.


C ++ Lambdas sont de types anonymes, un peu comme C # Lambdas. Dans ce contexte, auto et std :: fonction servir le même objectif que var et func respectivement.


C ++ Les Lambdas sont de types anonymes, un peu comme C # Lambdas. C'est un bon point. J'ai couru à travers ça il n'y a pas trop longtemps.


Vous n'avez pas besoin d'avoir des types anonymes pour bénéficier d'une inférence de type. En fait, je considérerais un système de type statique sans inférence d'être incomplete au mieux.


En plus des lambdas, il existe d'autres situations dans lesquelles le type de données n'est pas explicitement spécifié par la norme et dure ni impossible à prédire pour le programmeur. Un exemple est le type de retour de std :: lid .


GCC et SLIG ont un support assez meilleur C ++ 11 que MSVC.


IDEONE et Stack Brooked sont les deux compilateurs en ligne avec plus de support C ++ 11 que MSVC2012.


Vous avez tort, C ++ a des types anonymes, le compilateur et la bibliothèque généré. auto ne peut pas être utilisé pour les membres. Le livre de Stroustrup regorge de terribles erreurs et à ne pas faire confiance.


@ Robson3.14: Pouvez-vous prouver que?


Même en ignorant Lambdas, C ++ a des types anonymes: struct {} chose;


8 Réponses :


2
votes

sucre syntaxique

i plutôt dire xxx

sur xxx


0 commentaires

34
votes

auto code> a beaucoup d'utilisations lorsqu'il s'agit de la programmation générique et de sauvegarder le programmateur de taper.

Par exemple, considérez ceci. Souhaitez-vous plutôt taper: p> xxx pré>

ou: p> xxx pré>

oui, ils sont tous deux longtemps, mais nous savons le retour Tapez et spécifiez-le à nouveau est un peu lourd à taper. Cela va également pour les itérateurs: p> xxx pré>

vs: p> xxx pré>

Son utilisation dans la programmation générique est également de comprendre le rendement Type de fonction ou si vous faites des algorithmes génériques où vous ne connaissez pas le type. P>

Par exemple, considérez un exemple très fondamental. P>

[](auto a) { return a + 4; }


9 commentaires

RAPPTZ, a extrait le code pour coder les blocs pour rendre les différences plus évidentes. J'espère que ça ne vous dérange pas. Voici un +1 pour vous compenser si vous faites :-) Je plaisante, le +1 est parce que c'est une bonne réponse.


@paxdiablo merci! Je voulais faire ça aussi :)


Sérieusement, C ++ 14 déjà. J'étais tous excité que c ++ se rendit 'jusqu'à 11'. Comment vais-je toujours continuer, heh.


@sircoDesalot C ++ 14 est une version "mineure". Pas aussi gros que C ++ 11 mais apporte des choses très agréables à jouer comme des lambdas polymorphes, en option, en omettant le type de retour de fuite pour les fonctions et autres trucs intéressants.


Sur une note connexe. Je viens de commencer à télécharger la prévisualisation Visual Studio 2013. C'est dingue. 2012 vient de sortir. (Espérons que l'assistance C ++ 11/14 est meilleure).


@sircoDesalot: " Je viens de commencer à télécharger Visual Studio 2013 Aperçu. C'est fou. " Comment est-ce "insensé"? C'est un calendrier Livraison annuelle. Firefox aura huit versions dans un an, avec chrome ayant à peu près beaucoup aussi. Si quelque chose, le calendrier de libération de VS est lent, comparé à Clang (2 par an) et à GCC.


@Nicolbolas Je suppose qu'une différence entre eux est toutes libres pendant que Visual Studio est exclusif.


@Nicolbolas: La différence Beeing, que vs est assez cher ...


@sircoDesalot Je viens de commencer à télécharger Visual Studio 2013 Aperçu. C'est dingue. 2012 vient de sortir. Vous pourriez aussi bien dire "Je viens de regarder le calendrier et c'est 2013. C'est fou. 2012 vient de terminer."



15
votes

Il existe un certain nombre d'utilisations pour auto en C ++

  1. Objets de fonction anonymes, AKA Fermetures, AKA Lambda Instances. auto est le seul moyen de les stocker. Les types peuvent également être générés dérivés de ces types et des types sur leur dos, AD INFINITUM.

  2. C ++ peut avoir des types assez complexes, tels que le type d'itérateur non mutation dans une carte non ordonnée utilisant une fonction d'allocator et de hachage personnalisée. TypeDEF peut atténuer cela, mais le type d'un m.begin () avoir un nom particulier n'est pas si informatif: foo_iterator it = est comme significatif comme Auto FOO_ITERATOR = , et le auto On ne nécessite pas de plaque chauffante ailleurs.

  3. Déduction de type de retour utilise le mot-clé , qui est requis pour faire des fonctions fonctionner sans énormes quantités d'énormes traits Boiserie. L'élimination de la chaudrille est un thème commun: le système de type robuste de C ++ S signifie que les types peuvent comporter de nombreuses informations et le coder à chaque utilisation peut être contre-productif.

  4. dans certains ducktype Modèle , le travail à déduire Le type d'une variable est à peu près identique à celui de la valeur de Variables et de la structure presque identique, à la fois littéralement. : déclinger (expression longue) x = expression longue; . auto élimine cette duplication.

  5. Enfin in C ++ 1Y, Type déduction Lambdas Utilisez auto pour dire qu'un argument est déduit. Sorte d'un poids léger modèle . Parlez à étendre cela à Non Lambdas est également à Skunkworks.


1 commentaires

Depuis C ++ 20, le mot clé peut également être utilisé en tant que type de paramètre de fonction .



5
votes

Voici un exemple de vie réel où je ne pouvais pas, ne pas utiliser Auto

J'essayais de faire une instruction Type de commutation en C ++ lorsque le type de retour est spécifique et ne pouvait pas être déclaré facilement. Ainsi, l'utilisation d'un «auto» est probablement la bonne façon de résoudre le type de recherche de la déclaration de carte. P>

auto foo = boost::bind(&VegaFactory::load_commodity_one_leg,this,conn,_1);
std::map<std::string,decltype(foo)> methods;
methods.insert(std::make_pair("FOO",commodityOneLeg));

auto f = methods.find(bar);
// Call f here


1 commentaires

Cela peut utiliser std :: fonction au lieu de auto , il n'est donc pas tout à fait impossible de ne pas utiliser auto ...



3
votes

C ++ a des types "anonymes" - types que vous ne pouvez pas vous reporter par nom car le nom n'est pas disponible pour vous. C'était le cas même avant C ++ 11 et Lambdas. Considérez le code suivant:

class foo {
    class bar { 
      public:
        void baz() { }
    };
  public:        
    static bar func() { return bar(); }
};

foo::func().baz(); // OK, only the name "bar" is private
??? a = foo::func(); // Umm...
auto b = foo::func(); b.baz(); // Hooray!


1 commentaires

Oh, je vois ce que tu reçois. Intéressant.



1
votes

Ça vaut la peine de lire l'article d'Herb Sutter's presque toujours auto pour de grands exemples de la raison pour laquelle il vaut la peine d'utiliser auto sur des types explicites. Les principaux avantages sont la réduction de la dactylographie et donne une sécurité supplémentaire si les types sous-jacents changent. L'un de mes exemples préférés est toutefois de savoir comment il réduit la duplication. Si vous allouez sur la pile, vous utiliseriez: xxx

Toutefois, si vous souhaitez créer sur le tas, vous avez besoin: xxx

Vous avez donc dû dupliquer le MyClass MyClass xxx

si vous souhaitez le déclarer comme un unique_ptr , vous auriez auparavant besoin de: xxx

qui peut être abrégé à: xxx


0 commentaires

1
votes

en C ++, le mot-clé auto fournit un moyen de type de mécanisme de déduction. Par exemple, xxx

mot-clé auto dit que le compilateur de déterminer le type de variable I de l'expression du côté droit de l'opérateur d'affectation.

Par conséquent, si la valeur des expressions est double, alors variable je serai double. Ou, si la valeur des expressions est bool, alors la variable i sera bool.


0 commentaires

0
votes

APPRENEZ LE TYPE INFERENCE EN PREMIERIQUEMENT RÉFÉRENCE À LA DÉDUCTION AUTOMATIQUE DU TISSION DE DONNÉES D'UNE EXPRESSION DANS UN LANGUE DE PROGRAMMATION.

Avant C ++ 11 Toutes les variables de C ++ doivent déclarer expliquer explicitement, mais après la libération de C ++ 11, le compilateur lui-même déduit le type de variable au moment de l'exécution.

Nous pouvons l'utiliser pour des variables et même dans le cas des types de retour de fonction. Mais, il est suggéré d'éviter d'utiliser le type de retour automatique en fonction de la fonction.


1 commentaires

C'est incorrect. Le compilateur ne déduit rien au moment de l'exécution, il ne peut pas éventuellement faire cela, puisque le compilateur ne fonctionne pas au moment où vous pouvez exécuter l'exécutable produit. Le compilateur ne fonctionne que lors de la compilation et le type de variable est déduit lors de la compilation.