C++のクレイジーなtypedef:標準でこの構文を許可することに何の意味があるのでしょうか?
-
09-10-2019 - |
質問
古くからよく知られているもの:
typedef int cute_int; //cute : common and familiar syntax.
この構文は完璧です。問題ない。
さて、上記のように typedef を記述できる場合、この構文を許可する意味は何でしょうか。
int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.
プログラマを混乱させるためだけですか?この構文はどこでも必要なのでしょうか (実際には前の構文があるのに)。コンパイラの観点からはどう思いますか?彼らはそれをかわいいと思いますか、それともクレイジーだと思いますか?それともコンパイラにとってはまったく関係ないのでしょうか?
ちなみに、このコードはここから来ました:typedef および new での typename キーワードの使用
それが構文エラーなのかどうか疑問に思う場合は、チェックしてください 動作するコードはここにあります イデオンで。
他のヒント
問題は、「なぜあなたを混乱させるのですか?」です。
構文は、非常に一般的であり、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 ++の文法を読むことが役立つ場合があります。
私の g++ はそれを受け入れているようですが、私はこの構文を知りませんでした...しかし、コンパイラの観点から見ると、解析が難しくなります。遭遇したとき int
トークンの場合、型定義 (および typedef
が起きようとしています)、または変数/関数定義を解析しています...
持つことだけが意味のあること A typedef B
考慮すれば typedef
二項演算子であること (型の代入という意味で) A = B
).
これがStandartによって許可されているかどうかはわかりません。しかし、私たちが知っているように、C ++には多くのことがありますが、それは許可されていますが、イロジー的構文を持っています。たとえば、この種のこと 1[a], "hello"[2];// ...