for Qual è la differenza tra "typedef" e "using" in C++ 11?




c++ using typename (4)

L' uso della sintassi ha un vantaggio quando viene utilizzato all'interno dei modelli. Se è necessaria l'astrazione del tipo, ma è anche necessario mantenere in futuro il parametro del modello da specificare. Dovresti scrivere qualcosa come questo.

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; }

Ma l' uso della sintassi semplifica questo caso d'uso.

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

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

So che in C ++ 11 possiamo ora usare using per scrivere alias di tipo, come typedef s:

typedef int MyInt;

È, da quello che capisco, equivalente a:

using MyInt = int;

E questa nuova sintassi è emersa dallo sforzo di avere un modo per esprimere " template typedef ":

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

Ma, con i primi due esempi non modello, ci sono altre sottili differenze nello standard? Ad esempio, typedef s fa aliasing in un modo "debole". Cioè non crea un nuovo tipo ma solo un nuovo nome (le conversioni sono implicite tra quei nomi).

È lo stesso con l' using o genera un nuovo tipo? Ci sono delle differenze?


Answer #1

Sono in gran parte gli stessi, tranne che:

La dichiarazione alias è compatibile con i modelli, mentre lo stile C typedef non lo è.


Answer #2

Sono equivalenti, dallo standard (sottolineatura mia) (7.1.3.2):

Un nome typedef può anche essere introdotto da una dichiarazione alias. L'identificatore che segue la parola chiave using diventa un typedef-name e l'attributo-specificatore-seq opzionale che segue l'identificatore appartiene a quel typedef-name. Ha la stessa semantica come se fosse stata introdotta dallo specificatore typedef. In particolare, non definisce un nuovo tipo e non deve apparire nel tipo-id.


Answer #3

Sono essenzialmente uguali, ma using fornisce alias templates che è abbastanza utile. Un buon esempio che ho trovato è il seguente:

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

Quindi, possiamo usare std::add_const_t<T> invece di typename std::add_const<T>::type





using-declaration