Question Quelle est la différence entre 'typedef' et 'using' dans C ++ 11?


Je sais que dans C ++ 11, nous pouvons maintenant utiliser using écrire un alias de type, comme typedefs:

typedef int MyInt;

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

using MyInt = int;

Et cette nouvelle syntaxe a émergé de l'effort pour avoir un moyen d'exprimer "template typedef":

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

Mais, avec les deux premiers exemples non-modèles, y a-t-il d'autres différences subtiles dans la norme? Par exemple, typedefs faire un aliasing de manière "faible". C'est-à-dire qu'il ne crée pas un nouveau type mais seulement un nouveau nom (les conversions sont implicites entre ces noms).

Est-ce la même chose avec using ou génère-t-il un nouveau type? Y a-t-il des différences?


663
2018-05-25 02:39


origine


Réponses:


Ils sont équivalents, à partir de la norme (soulignement mien) (7.1.3.2):

Un typedef-name peut aussi être introduit par une alias-declaration. le   identifiant suivant le mot-clé using devient un typedef-name et le   attribut-specifier-seq optionnel suivant l'identifiant   à ce nom de typedef. Il a la même sémantique que s'il était   introduit par le spécificateur typedef. En particulier, il   ne définit pas un nouveau type et n'apparaît pas dans le type-id.


438
2018-05-25 03:16



le en utilisant La syntaxe a un avantage lorsqu'elle est utilisée dans des modèles. Si vous avez besoin de l'abstraction de type, mais aussi besoin de garder le paramètre de modèle à être possible d'être spécifié à l'avenir. Tu devrais écrire quelque chose comme ça.

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 { typename rebind<U>::type _var_member; }

Mais en utilisant 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; }

152
2018-04-21 11:39



Ils sont en grande partie les mêmes, sauf que

The alias declaration is compatible with templates, whereas the C style typedef is not.


121
2017-10-05 22:58



Ils sont essentiellement les mêmes mais using fournit alias templates ce qui est très utile. Un bon exemple que je pourrais trouver est le suivant:

namespace std {
 template<typename T> using add_const_t = typename add_const<T>::type;
}

Donc, nous pouvons utiliser std::add_const_t<T> au lieu de typename std::add_const<T>::type


7
2018-03-31 08:20