为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

4 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

分组。

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

int f(int);

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

int *f(int);

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

int (*f)(int);

同样处理数组:

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


查看完整回答
反对 回复 2019-09-26
?
弑天下

TA贡献1818条经验 获得超8个赞

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

<front type> <specification>;

例如,在以下声明中:

int* p[2];

“ front type”是int(不是int*),“ specification”是* 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))加上括号- 您将得到想要的

  • 该语句除了创建一个临时对象外什么都不做,在该指令结束后,该对象将不再存在(我希望这是您要执行的操作)。


查看完整回答
反对 回复 2019-09-26
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

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

查看完整回答
反对 回复 2019-09-26
?
桃花长相依

TA贡献1860条经验 获得超8个赞

尽量避免自己编写语法,并使用标准中提供的语法。<front-type> <specification>是误导和错误的。语法是<declaration-specifier> <declarator>

查看完整回答
反对 回复 2019-09-26
  • 4 回答
  • 0 关注
  • 818 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信