[C++] 为什么C ++允许我们在声明变量时在括号中包含变量名?


Answers

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

<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)) ,你会得到你想要的
  • 这个声明只是创建一个临时对象,在这个指令结束后不再生活(我希望这是你想要做的)。
Question

例如像这样的声明:

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 (((x))) = 0; 但我从来没有见过任何人使用这样的声明。 所以我很感兴趣 - 这种可能性的目的是什么,因为现在我发现它只创造类似于臭名昭着的“最令人头疼的解析”的情况,并没有添加任何有用的东西?