C++のクレイジーなtypedef:標準でこの構文を許可することに何の意味があるのでしょうか?

StackOverflow https://stackoverflow.com/questions/4422816

質問

古くからよく知られているもの:

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];// ...

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top