1126 votes

Quelle est la différence entre "typedef" et "aide" en C++11?

Je sais qu'en C++11, nous pouvons maintenant utiliser using pour écrire des alias de type, comme typedefs:

typedef int MyInt;

Est, d'après ce que je comprends, ce qui équivaut à:

using MyInt = int;

Et que la nouvelle syntaxe a émergé à partir de l'effort de disposer d'un moyen d'exprimer "template typedef":

template< class T > using MyType = AnotherType< T, MyAllocatorType >;

Mais, avec les deux premiers non-exemples de modèle, existe-il d'autres différences subtiles dans la norme? Par exemple, typedefs ne l'aliasing dans les "faibles". Ce n'est pas de créer un nouveau type, mais seulement un nouveau nom (conversions implicites entre ces noms).

Est-ce la même chose avec using ou faut-il générer un nouveau type? Existe-il des différences?

648voto

Jesse Good Points 22971

Ils sont l'équivalent, à partir de la norme (c'est moi qui souligne) (7.1.3.2):

Une définition de type-nom peut également être introduit par un pseudonyme-déclaration. L' identificateur de suite à l'aide de mot-clé devient un typedef,-le nom et l' attribut facultatif spécificateur-seq suivant l'identificateur appartient pour que la définition de type-nom. Il a la même sémantique que si elle était introduit par la définition de type spécificateur. En particulier, il ne pas définir un nouveau type et il ne doit pas apparaître dans le type-id.

221voto

fenix Points 115

L' aide de la syntaxe a un avantage lorsqu'il est utilisé dans les modèles. Si vous avez besoin du type d'abstraction, mais aussi besoin de garder paramètre de modèle afin d'être possible d'être spécifié dans l'avenir. Vous devriez écrire quelque chose comme cela.

template <typename T> struct whatever {};

template <typename T> struct rebind
{
  typedef whatever<T> type; // to make it possible to substitue the whatever in future.
};

rebind<int>::type variable;

template <typename U> struct bar { rebind<U>::type _var_member; }

Mais à l'aide de la syntaxe simplifie ce cas d'utilisation.

template <typename T> using my_type = whatever<T>;

my_type<int> variable;
template <typename U> struct baz { my_type<U> _var_member; }

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