cpp - typedef enum c++




В чем разница между «typedef» и «use» в C++ 11? (3)

Они во многом одинаковы, за исключением того, что:

Объявление alias совместимо с шаблонами, в то время как тип ty styleef не является.

Я знаю, что в C ++ 11 мы теперь можем использовать using для написания псевдонима типа, например typedef s:

typedef int MyInt;

Насколько я понимаю, это эквивалентно:

using MyInt = int;

И этот новый синтаксис возник из усилий, чтобы иметь способ выразить « template typedef »:

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

Но, с первыми двумя примерами, отличными от шаблонов, существуют ли какие-либо другие тонкие различия в стандарте? Например, typedef s делает сглаживание «слабым» способом. То есть он не создает новый тип, а только новое имя (между этими именами подразумеваются преобразования).

То же самое с using или генерирует новый тип? Есть ли различия?


Они эквивалентны из стандартного (акцент мой) (7.1.3.2):

Имя typedef также может быть введено с помощью объявления alias. Идентификатор, следующий за ключевым словом using, становится typedef-name и необязательным атрибутом-спецификатором-seq, следующим за идентификатором, к этому typedef-name. Он имеет ту же семантику, как если бы он был введен спецификатором typedef. В частности, он не определяет новый тип и не должен отображаться в идентификаторе типа.


Синтаксис использования имеет преимущество при использовании в шаблонах. Если вам нужна абстракция типа, но также необходимо сохранить параметр шаблона, который можно будет указать в будущем. Вы должны написать что-то вроде этого.

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

Но использование синтаксиса упрощает этот вариант использования.

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

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






using-declaration