熟悉的老人:
typedef int cute_int; //cute : common and familiar syntax.
这种语法很完美。没问题。
现在,当我们可以像上面那样编写typedef时,那么允许这种语法是什么意思:
int typedef crazy_int; //crazy : uncommon and unfamiliar syntax.
只是为了迷惑程序员?甚至在任何地方都需要这种语法(实际上我们是前一个)?你从编译器的角度怎么看?他们发现它可爱还是疯狂?或者对编译器来说无关紧要?
顺便说一句,这段代码来自这里: Use of typename keyword with typedef and new
如果您想知道这是否是语法错误,请在ideone处查看the working code here。
答案 0 :(得分:10)
答案 1 :(得分:10)
问题是“为什么会让你困惑?”
语法来自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 ++的语法可能有所帮助。
答案 2 :(得分:1)
我不知道这种语法,虽然我的g ++似乎接受了它......但是从编译器的角度来看,它会使解析更难:当你遇到int
令牌时,你不知道是否你正在解析一个类型定义(并且typedef
即将发生)或者你正在解析一个变量/函数定义......
如果您认为A typedef B
是二元运算符(在类型赋值为typedef
的意义上),那么A = B
的唯一意义就是。
答案 3 :(得分:0)
我不确定标准是否允许这样做。但是正如我们所知,c ++中有很多东西允许但却有不合逻辑的语法。例如,1[a], "hello"[2];// ...