С++ 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.
Ответы
Ответ 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];// ...