Подтвердить что ты не робот

Разница между typedef и псевдонимом типа С++ 11

Я читаю псевдонимы шаблонов здесь: http://en.cppreference.com/w/cpp/language/type_alias

И мне интересно, даже если это написано в самой первой строке страницы, с которой я связан, какая разница между typedef и псевдонимом типа (using mytype = T;)

Разве они не взаимозаменяемы?

4b9b3361

Ответ 1

Там нет абсолютно никакой разницы между обоими.

Если вы посмотрите на стандарт:

7.1.3 Спецификатор typedef [dcl.typedef]

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

7.3.3 Объявление использования [namespace.udecl]

Если в объявлении использования используется ключевое слово typename и указано зависимое имя (14.6.2), имя, введенное в объявлении использования, обрабатывается как typedef-name.


Однако с этой страницы: http://en.cppreference.com/w/cpp/language/type_alias

Говорят:

Псевдонимы типов похожи на typedef, однако имеют преимущество работы с шаблонами.

Кажется, это

// template type alias
template<class T> using ptr = T*;
// the name 'ptr<T>' is now an alias for pointer to T
ptr<int> x;

возможно только с using директивы using.


И не забывайте, что это особенность С++ 11. Некоторые компиляторы пока не поддерживают это.

Ответ 2

Нет никакой разницы.

typedef дает имя псевдонима для типа.