Je comprends donc en utilisant (c'est un peu cool que contrairement à C #, var code> 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é code> code> p>
auto code> fonctionne pour les variables de membre / globales, qui est cool je suppose, mais ne semble pas suffisamment pour justifier son existence). P>
8 Réponses :
i plutôt dire p> sur p>
Par exemple, considérez ceci. Souhaitez-vous plutôt taper: p> ou: p> 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> vs: p> 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 code> a beaucoup d'utilisations lorsqu'il s'agit de la programmation générique et de sauvegarder le programmateur de taper.
[](auto a) { return a + 4; }
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. i>" Comment est-ce "insensé"? C'est un calendrier i> Livraison annuelle. Firefox aura huit versions i> 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. Code> Vous pourriez aussi bien dire "Je viens de regarder le calendrier et c'est 2013. C'est fou. 2012 vient de terminer."
Il existe un certain nombre d'utilisations pour Objets de fonction anonymes, AKA Fermetures, AKA Lambda Instances. 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. Déduction de type de retour utilise le mot-clé code> code>, qui est requis pour faire des fonctions code> 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. P> LI>
dans certains ducktype Enfin in C ++ 1Y, Type déduction Lambdas Utilisez auto code> en C ++ p>
auto code> 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. P> LI>
TypeDEF code> peut atténuer cela, mais le type d'un
m.begin () code> avoir un nom particulier n'est pas si informatif:
foo_iterator it = code> est comme significatif comme
Auto FOO_ITERATOR = CODE>, et le
auto code> On ne nécessite pas de plaque chauffante ailleurs. p> li>
Modèle code>, 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; code>.
auto code> élimine cette duplication. P> li>
auto code> pour dire qu'un argument est déduit. Sorte d'un poids léger
modèle code>. Parlez à étendre cela à Non Lambdas est également à Skunkworks. P> Li>
ol>
Depuis C ++ 20, le mot clé code> code> peut également être utilisé en tant que type de paramètre de fonction .
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
Cela peut utiliser std :: fonction code> au lieu de
auto code>, il n'est donc pas tout à fait impossible de ne pas utiliser
auto code> ...
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!
Oh, je vois ce que tu reçois. Intéressant.
Ç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 Toutefois, si vous souhaitez créer sur le tas, vous avez besoin: p> Vous avez donc dû dupliquer le si vous souhaitez le déclarer comme un qui peut être abrégé à: p> auto code> 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:
MyClass MyClass, mais le RHS force déjà la variable d'être un pointeur code> MyClass MyClass, afin que vous puissiez simplement l'utiliser à la place: p>
unique_ptr code>, vous auriez auparavant besoin de: p>
en C ++, le mot-clé auto fournit un moyen de type de mécanisme de déduction. Par exemple, 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. P> 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. P> p>
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. P>
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. P>
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. P>
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.
Je ne décrirais pas
var code> 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 i> utiliser
var code>. Il vous suffit d'utiliser
var code> 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 code> et
std :: fonction code> servir le même objectif que
var code> et
func code> respectivement.
C ++ Les Lambdas sont de types anonymes, un peu comme C # Lambdas. Code> 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 code>
.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; code>