В чем разница между "typedef" и "using" в C++11?
Я знаю, что в C++11 теперь мы можем использовать using
чтобы написать псевдоним типа, например typedef
s:
typedef int MyInt;
, насколько я понимаю, эквивалентно:
using MyInt = int;
и этот новый синтаксис возник из попытки найти способ выразить "template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
но, с первыми двумя примерами без шаблона, есть ли какие-либо другие тонкие различия в стандарте? Например, typedef
s делают сглаживание "слабым" способом. То есть он не создает новый тип, а только новое имя (преобразования неявны между этими именами).
то же самое с using
или он генерирует новый тип? Есть ли различия?
4 ответов
они эквивалентны, из стандарта (акцент мой) (7.1.3.2):
имя typedef также может быть введено объявлением псевдонима. Этот идентификатор, следующий за ключевым словом using, становится typedef-name и необязательный атрибут-спецификатор-сл следующим идентификатором принадлежит к этому typedef-имя. Он имеет ту же семантику, как если бы это было введено спецификатором typedef. в частности, не определяет новый тип и не должен появится в type-id.
на используя синтаксис имеет преимущество при использовании в шаблонах. Если вам нужна абстракция типа, но также необходимо сохранить параметр шаблона, который можно будет указать в будущем. Ты должен написать что-то вроде этого.
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; }
Они в основном аналогичны, за исключением того, что:
объявление псевдонима совместимо с шаблонами, тогда как C стиль typedef не является.
они по существу одинаковы, но using
предоставляет alias templates
что весьма полезно. Один хороший пример, который я мог бы найти, заключается в следующем:
namespace std {
template<typename T> using add_const_t = typename add_const<T>::type;
}
Итак, мы можем использовать std::add_const_t<T>
вместо typename std::add_const<T>::type