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

例如这样的声明:

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;但是我从未见过有人实际使用过这样的声明。因此,我很感兴趣-这种可能性的目的是什么,因为到目前为止,我看到它只会创建类似于臭名昭著的“最令人烦恼的分析”的案例,并且没有添加任何有用的信息?


MM们
浏览 819回答 4
4回答

holdtom

分组。作为一个特定的示例,请考虑您可以声明一个函数类型的变量,例如int&nbsp;f(int);现在,您将如何声明一个指向此类事件的指针?int&nbsp;*f(int);不,不行!这被解释为函数returning&nbsp;int*。您需要添加括号以使其以正确的方式进行解析:int&nbsp;(*f)(int);同样处理数组:int&nbsp;*x[5];&nbsp;&nbsp;&nbsp;//&nbsp;array&nbsp;of&nbsp;five&nbsp;int*int&nbsp;(*x)[5];&nbsp;//&nbsp;pointer&nbsp;to&nbsp;array&nbsp;of&nbsp;five&nbsp;int

弑天下

通常允许在此类声明中使用括号,因为从语法的角度来看,声明总是像这样:<front&nbsp;type>&nbsp;<specification>;例如,在以下声明中:int*&nbsp;p[2];“ front type”是int(不是int*),“ specification”是* p[2]。规则是,您可以根据需要在“规格”部分中使用任意数量的括号,因为有时不可避免地要消除歧义。例如:int*&nbsp;p[2];&nbsp;//&nbsp;array&nbsp;of&nbsp;2&nbsp;pointers&nbsp;to&nbsp;int;&nbsp;same&nbsp;as&nbsp;int&nbsp;(*p[2]);int&nbsp;(*p)[2];&nbsp;//&nbsp;pointer&nbsp;to&nbsp;an&nbsp;array&nbsp;of&nbsp;2&nbsp;ints指向数组的指针很少见,但是与指向函数的指针相同:int&nbsp;(*func(int));&nbsp;//&nbsp;declares&nbsp;a&nbsp;function&nbsp;returning&nbsp;int*int&nbsp;(*func)(int);&nbsp;//&nbsp;declares&nbsp;a&nbsp;pointer&nbsp;to&nbsp;function&nbsp;returning&nbsp;int这是您问题的直接答案。如果您的问题是关于的声明C(y),则:在整个表达式中(C(y))加上括号-&nbsp;您将得到想要的该语句除了创建一个临时对象外什么都不做,在该指令结束后,该对象将不再存在(我希望这是您要执行的操作)。

缥缈止盈

正如我提到的,起初它是在析构函数中执行某些操作,我猜这是相当标准的事情,因为您有一些用于设置某些参数然后在析构函数中完成所有工作的“链接”功能。不过,感谢您提供另一种解决方法,我想写作{}毕竟是最有效的一种方法。

桃花长相依

尽量避免自己编写语法,并使用标准中提供的语法。<front-type> <specification>是误导和错误的。语法是<declaration-specifier> <declarator>
打开App,查看更多内容
随时随地看视频慕课网APP