Объявление typedef в виде `int typedef my_int;` - PullRequest
3 голосов
/ 09 ноября 2019

Чтобы объявить my_int как псевдоним типа для int, мы можем написать:

typedef int my_int;   // (1)

Любопытно, что следующее также определяет псевдоним int:

int typedef my_int;   // (2)

Я никогда раньше не видел такой синтаксис. Почему это работает?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2019

Действительно, ваша интерпретация верна, как объяснено здесь :

Спецификатор typedef, когда используется в объявлении decl-specier-seq, указывает, что объявление является typedefобъявление и объявляет typedef-имена, а не функции или объекты.

Тем не менее, в современном c ++ псевдоним типа лучше определить с помощью предложения using:

using my_int = int; 

Это не просто вопрос стиля: typedef не поддерживает шаблонизацию, тогда как псевдоним типа:

template <typename T>
using my_list = list<T>;   // not possible with typedef
...
my_list<double> numbers; 
2 голосов
/ 09 ноября 2019

Мое рассуждение после прочтения C ++ ссылка таково: (1) и (2) являются объявлениями формы

specifiers-and-qualifiers declarators-and-initializers;

с specifiers-and-qualifiers, равным typedef int или int typedef.

Порядок спецификаторов и квалификаторов не имеет значения, и оба (1) и (2) являются допустимыми объявлениями псевдонима типа. Например, чтобы определить псевдоним для const int, мы можем в принципе использовать любую из этих 6 комбинаций:

typedef int const my_cint;
typedef const int my_cint;
int typedef const my_cint;
const typedef int my_cint;
int const typedef my_cint;
const int typedef my_cint;
...