例如这样的声明:
int (x) = 0;
甚至是:
int (((x))) = 0;
我偶然发现了这个,因为在我的代码中我碰巧有一个类似于下面的片段:
struct B
{
};
struct C
{
C (B *) {}
void f () {};
};
int main()
{
B *y;
C (y);
}
显然我想构造对象 C
然后它会在它的析构函数中做一些有用的事情。然而,碰巧编译器对待 C (y);
作为变量声明 y
与类型 C
因此它打印出关于 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
关于c++ - 为什么 C++ 允许我们在声明变量时将变量名括在括号中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56513788/