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

С++ crazy typedef: в чем смысл разрешить этот синтаксис стандартом?

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

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

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

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

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

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


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

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

4b9b3361

Ответ 1

"Оборотная сторона этого заключается в том, что вам приходится иметь дело со старыми ошибками и проблемами совместимости. Например, я считаю синтаксис C-синтаксиса экспериментом, который но я принял его для С++. Альтернативы и улучшения, которые я рассматривал в то время, не имели бы улучшенных вопросов. Я оцениваю как второстепенную проблему. Более серьезная проблема заключается в том, чтобы поддерживать близость определений языка по мере развития C" . - Бьярне Страуструп

Ответ 2

Вопрос: "Почему он вас смущает?"

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

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;

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

Ответ 3

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

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

Ответ 4

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