为什么C++允许我们在声明变量时将变量名称括在括号中?

Why does C++ allow us to surround the variable name in parentheses when declaring a variable?

本文关键字:变量名 变量 声明 许我们 C++ 我们 为什么      更新时间:2023-10-16

例如这样的声明:

int (x) = 0;

甚至:

int (((x))) = 0;

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

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

显然,我想构造对象C然后在其析构函数中做一些有用的事情。但是,碰巧编译器C (y);视为类型为C的变量y声明,因此它会打印有关y重新定义的错误。有趣的是,如果我将其编写为C (y).f ()或类似C (static_cast<B*> (y)),它将按预期编译。当然,最好的现代解决方法是在构造函数调用中使用{}

因此,正如我在那之后发现的那样,可以声明像int (x) = 0;甚至int (((x))) = 0;这样的变量,但我从未见过有人真正使用这样的声明。所以我很感兴趣 - 这种可能性的目的是什么,因为现在我看到它只创建了类似于臭名昭著的"最令人烦恼的解析"的情况,并没有添加任何有用的东西?

> 分组。

作为一个特定示例,请考虑您可以声明函数类型的变量,例如

int f(int);

现在,您将如何声明指向此类事物的指针?

int *f(int);

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

int (*f)(int);

数组也是如此:

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

通常允许在此类声明中使用括号,因为从语法的角度来看,声明总是如下所示:

<front type> <specification>;

例如,在以下声明中:

int* p[2];

"正面类型"是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)这样的陈述,那么:

  • 在整个表达式周围加上括号 -(C(y)),你会得到你想要的
  • 此语句只创建一个临时对象,该对象在此指令结束后停止存在(我希望这是您打算做的)。