为什么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立一个暂时的对象,在这个指令结束后不再生活(我希望这是你想要做的)。