请考虑以下代码:
int main() {
int(s);
}
我很惊讶它创建了有效的变量s
。谁能解释一下这里发生了什么?
答案 0 :(得分:23)
[dcl.meaning]说:
在声明
T D
中,D
的格式为( D1 )
,所包含的声明者ID 的类型与所包含的T D1中的> declarator-id 。括号不会改变嵌入式 declarator-id 的类型,但它们可以改变复杂声明符的绑定。
更简单地说,你可以将括号括在任何被认为是"声明者"在C ++语法中。 (松散地说,声明符是声明的一部分,没有包含一个名称的初始说明符和类型。)
在您的示例中,标识符s
是一个声明符,因此您可以在其周围加上括号,其含义不会发生变化。
正如第二个引用的句子提示的那样,其原因在于,当事情变得更复杂时,它可能是必要的。一个例子:
int * a [10]; // a is an array of ten pointers to int.
int ( * b ) [10]; // b is a pointer to an array of ten ints.
答案 1 :(得分:2)
只是添加其他答案;在声明者的语法摘要(C ++ 14 [dcl.decl] / 4)中,您可以找到:
ptr-declarator:
noptr-declarator
noptr-declarator:
( ptr-declarator )
(我已经省略了语法的其他细节)。你可以从中看到,任何声明符都可以用括号括起来,它仍然匹配相同的语法规则。