C ++ сумасшедший typedef: какой смысл разрешать этот синтаксис стандартом? - PullRequest
13 голосов
/ 12 декабря 2010

Старый знакомый:

typedef int cute_int; //cute : common and familiar syntax. 

Этот синтаксис идеален.Нет проблем.

Теперь, когда мы можем написать typedefs, как описано выше, тогда какой смысл разрешать этот синтаксис:

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.

Просто чтобы сбить с толку программистов?Нужен ли этот синтаксис где-либо еще (когда мы на самом деле использовали предыдущий)?Что вы думаете с точки зрения компиляторов?Они находят это милым или сумасшедшим?Или это вообще не имеет значения для компиляторов?


Кстати, этот код появился здесь: Использование ключевого слова typename с typedef и новым

В случае, если вам интересно, является ли это синтаксической ошибкой, посмотрите рабочий код здесь в ideone.

Ответы [ 4 ]

10 голосов
/ 12 декабря 2010

Вопрос в том, «почему вас это смущает?»

Синтаксис взят из грамматики спецификаторов объявлений в C ++, которая является очень общей и используется для многих вещей в C ++. Порядок указателей объявлений не имеет значения. Посмотрите на это:

int virtual f() const, *g(int);
int ptr1, *ptr2;
int typedef const *name1, name2;

Это эквивалентно:

virtual int f() const;
virtual int* g(int);
int ptr1;
int *ptr2;
typedef const int* name1;
typedef const int name2;

Если вы посмотрите на них достаточно долго, вы обнаружите, что синтаксис фактически одинаков и логичен. Также может помочь чтение грамматики C ++.

1 голос
/ 12 декабря 2010

Я не знал об этом синтаксисе, хотя мой g ++, кажется, принимает его ... но с точки зрения компилятора, это усложняет синтаксический анализ: когда вы сталкиваетесь с токеном int, вы не знаете, 'повторный анализ определения типа (и typedef собирается произойти), или вы анализируете определение переменной / функции ...

Единственный смысл иметь A typedef B - это если вы считаете typedef быть бинарным оператором (в смысле присвоения типа как A = B).

0 голосов
/ 12 декабря 2010

Я не уверен, что это разрешено стандартом.Но, как мы знаем, в c ++ есть много вещей, которые допускают, но имеют логический синтаксис.Например, такие вещи 1[a], "hello"[2];// ...

...