C++ crazy typedef:标准允许这种语法有什么意义?

Naw*_*waz 13 c++ iso typedef standards-compliance user-defined-types

老熟悉的一个:

typedef int cute_int; //cute : common and familiar syntax. 
Run Code Online (Sandbox Code Playgroud)

这种语法很完美.没问题.

现在,当我们可以像上面那样编写typedef时,那么允许这种语法是什么意思:

int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.
Run Code Online (Sandbox Code Playgroud)

只是为了迷惑程序员?甚至在任何地方都需要这种语法(实际上我们是前一个)?你从编译器的角度怎么看?他们发现它可爱还是疯狂?或者对编译器来说无关紧要?


顺便说一下,这段代码来自: 使用typename关键字和typedef和new

如果您想知道这是否是语法错误,请在ideone处查看工作代码.

ybu*_*ill 10

问题是"为什么会让你感到困惑?"

语法来自C++中的声明说明符的语法,它非常通用,并且用于C++中的许多事情.声明说明符的顺序无关紧要.看看这些:

int virtual f() const, *g(int);
int ptr1, *ptr2;
int typedef const *name1, name2;
Run Code Online (Sandbox Code Playgroud)

这相当于:

virtual int f() const;
virtual int* g(int);
int ptr1;
int *ptr2;
typedef const int* name1;
typedef const int name2;
Run Code Online (Sandbox Code Playgroud)

如果你仔细观察它们,你会发现语法实际上是统一的和合乎逻辑的.阅读C++的语法也许会有所帮助.

  • @Nawaz:问题在于你将这两种形式视为不同的语法,但它们实际上是相同的.所以我可以争辩说,这样你就不需要记住第一个`inline`,`const`,`friend`或`int`的顺序. (3认同)
  • 当我用C#写作时,总是让我恼火的是它强制执行"虚拟"和"覆盖"等命令. (3认同)
  • @ybungalobill:就知道不同的语法而言,这篇文章很好.但问题仍然是一样的:为什么允许不同的语法来实现同样的东西?真正的问题是,它使程序员混淆了哪种语法"真正"不同并且确实做了不同的事情,哪种语法不同但做同样的事情.例如,程序员需要记住6种语法,它们只能做2种不同的事情! (2认同)