C ++标准的哪一部分允许在括号中声明变量?

时间:2017-08-31 22:46:00

标签: c++

请考虑以下代码:

int main() {
    int(s);
}

我很惊讶它创建了有效的变量s。谁能解释一下这里发生了什么?

2 个答案:

答案 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 )

(我已经省略了语法的其他细节)。你可以从中看到,任何声明符都可以用括号括起来,它仍然匹配相同的语法规则。