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

标签 c++ most-vexing-parse

例如这样的声明:

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/

相关文章:

c++ - 变量没有类类型,即使它已被定义

c++ - STL vector 使用问题——函数返回非零Iterator

c++ - Char* 相关的内存泄漏

c++ - 这两个版本的代码有什么区别?

c++ - 如何正确使用 vector 范围构造函数?

c++ - 从方法堆栈编译中按值返回实例

C++ 函数 = 删除

c++ - 如何创建新功能并在游戏运行时执行?

c++ - 尝试创建重载 + 运算符时在 main 函数中写什么

c++ - 尝试创建临时对象时出现奇怪的编译器错误