Я знаю, что в C ++ 11 теперь мы можем использовать using
для записи псевдоним типа, например, typedef
s:
typedef int MyInt;
Насколько я понимаю, эквивалентно:
using MyInt = int;
И этот новый синтаксис возник в результате попытки выразить " template typedef
":
template< class T > using MyType = AnotherType< T, MyAllocatorType >;
Но с первыми двумя примерами, не относящимися к шаблону, есть ли еще какие-то тонкие различия в стандарте? Например, typedef
s делают псевдонимы «слабым» способом. То есть он не создает новый тип, а только новое имя (между этими именами неявные преобразования).
Это то же самое с using
или это генерирует новый тип? Есть ли различия?
c++
c++11
typedef
using-declaration
Klaim
источник
источник
typedef void (&MyFunc)(int,int);
илиusing MyFunc = void(int,int);
?typedef void MyFunc(int,int);
(что на самом деле выглядит не так уж плохо), илиusing MyFunc = void(&)(int,int);
using MyFunc = void(&)(int,int);
? значит лиMyFunc
это ссылка на функцию? Что делать, если вы пропустите & ?typedef void (&MyFunc)(int,int);
. Если вы пропустите&
это эквивалентноtypedef void MyFunc(int,int);
Ответы:
Они эквивалентны стандарту (выделено мной) (7.1.3.2):
источник
using
ключевое слово, кажется, надмножествоtypedef
. Тогда будетtypdef
осуждается в будущем?using
синтаксис именно потому, чтоtypedef
семантика плохо работала с шаблонами. Что как-то противоречит тому факту, чтоusing
он имеет точно такую же семантику.n1489
. Псевдоним шаблона - это не псевдоним для типа, а псевдоним для группы шаблонов. Чтобы сделать различие междуtypedef
ощущаемой необходимостью нового синтаксиса. Кроме того, имейте в виду, что вопрос OP о разнице между не шаблонными версиями.typdef
чтобы меня осуждали никогда.Они в основном одинаковы, за исключением того, что:
источник
typedef
если я могу спросить?С использованием синтаксиса имеет преимущество при использовании в шаблонах. Если вам нужна абстракция типа, но также необходимо сохранить параметр шаблона, чтобы его можно было указывать в будущем. Вы должны написать что-то вроде этого.
Но использование синтаксиса упрощает этот вариант использования.
источник
Они по сути одинаковы, но
using
предоставляют,alias templates
что весьма полезно. Один хороший пример, который я мог найти, заключается в следующем:Таким образом, мы можем использовать
std::add_const_t<T>
вместоtypename std::add_const<T>::type
источник
Я знаю, что у оригинального плаката есть отличный ответ, но для любого, кто спотыкается в этой теме, как у меня, есть важное примечание из предложения, которое, я думаю, добавляет что-то ценное к обсуждению здесь, особенно к проблемам в комментариях о том,
typedef
является ли ключевое слово будет помечен как устаревший в будущем или удален за то, что он является избыточным / старым:Для меня это подразумевает постоянную поддержку
typedef
ключевого слова в C ++, потому что он все еще может сделать код более читабельным и понятным .Обновление
using
ключевого слова было специально для шаблонов и (как было указано в принятом ответе), когда вы работаете с не-шаблонамиusing
иtypedef
механически идентичны, так что выбор полностью за программистом на основе читабельности и передачи намерений ,источник
Оба ключевых слова эквивалентны, но есть несколько предостережений. Одна из них заключается в том, что объявление указателя функции с помощью
using T = int (*)(int, int);
более четкого, чем сtypedef int (*T)(int, int);
. Во-вторых, шаблон псевдонима формы невозможенtypedef
. В-третьих, раскрытие C API потребуетtypedef
публичных заголовков.источник
Объявления Typedef могут, тогда как объявления псевдонимов не могут быть использованы в качестве операторов инициализации
Хотя и в угловом случае, объявление typedef является оператором init и, таким образом, может использоваться в контекстах, которые допускают операторы инициализации
в то время как псевдоним декларация является не INIT-заявление , и не может , таким образом , можно использовать в условиях , которые позволяют операторы инициализации
источник