为什么C ++在声明一个variables时允许我们在括号中包含variables名?

例如一个这样的声明:

int (x) = 0; 

或者甚至:

 int (((x))) = 0; 

我偶然发现了这一点,因为在我的代码中,碰巧有一个类似于以下的片段:

 struct B { }; struct C { C (B *) {} void f () {}; }; int main() { B *y; C (y); } 

显然我想构build对象C ,然后在其析构函数中做一些有用的事情。 然而,正如它发生的编译器对待C (y); 作为typesC的variablesy的声明,因此它会打印一个关于y定义的错误。 有趣的是,如果我把它写成C (y).f ()或者像C (static_cast<B*> (y)) ,它将按照预期进行编译。 当然,最好的现代解决方法是在构造函数调用中使用{}

所以当我想到后,可以声明像int (x) = 0; 甚至int (((x))) = 0; 但我从来没有见过任何人使用这样的声明。 所以我很感兴趣 – 这种可能性的目的是什么,因为现在我发现它只创造类似臭名昭着的“最令人头痛的parsing”的情况,并没有增加任何有用的东西?

分组。

作为一个特定的例子,考虑你可以声明一个函数types的variables,比如

 int f(int); 

现在,你将如何宣布这样一个指针?

 int *f(int); 

不,不行! 这被解释为返回int*的函数。 您需要在括号中添加以使其parsing正确的方式:

 int (*f)(int); 

与数组相同的处理:

 int *x[5]; // array of five int* int (*x)[5]; // pointer to array of five int 

通常在这样的声明中允许使用圆括号,因为从语法的angular度来看,声明看起来总是这样的:

 <front type> <specification>; 

例如,在下面的声明中:

 int* p[2]; 

“前面的types”是int (而不是int* ),“规格”是* p[2]

规则是你可以根据需要在“规范”部分使用任意数量的括号,因为它们有时不可避免地消除歧义。 例如:

 int* p[2]; // array of 2 pointers to int; same as int (*p[2]); int (*p)[2]; // pointer to an array of 2 ints 

指向数组的指针是一种罕见的情况,但是与指向函数的指针的情况相同:

 int (*func(int)); // declares a function returning int* int (*func)(int); // declares a pointer to function returning int 

这是你的问题的直接答案。 如果你的问题是关于像C(y)这样的陈述,那么:

  • 把括号括在整个expression式中 – (C(y)) ,你会得到你想要的
  • 这个陈述只是build立一个暂时的对象,在这个指令结束后不再生活(我希望这是你想要做的)。