C++ C++;标准是否允许在括号中声明变量?
考虑以下代码:C++ C++;标准是否允许在括号中声明变量?,c++,C++,考虑以下代码: int main() { int(s); } 我很惊讶它创建了有效的变量s。有人能解释一下这里发生了什么吗?[dcl.means]标准中说: 在声明td中,其中D的形式为(D1),包含的声明器id的类型与声明td1中包含的声明器id的类型相同 括号不会改变嵌入式声明器id的类型,但可以改变复杂声明器的绑定 更简单地说,你可以把括号放在任何被认为是C++语法中的“声明器”的周围。(不严格地说,声明器是声明的一部分,没有包含一个名称的初始说明符和类型。) 在您的示例中,标识
int main() {
int(s);
}
我很惊讶它创建了有效的变量
s
。有人能解释一下这里发生了什么吗?[dcl.means]标准中说:
在声明td
中,其中D
的形式为(D1)
,包含的声明器id的类型与声明td1
中包含的声明器id的类型相同
括号不会改变嵌入式声明器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.
只是为了补充其他答案;在声明器的语法摘要(C++14[dcl.decl]/4)中,您可以找到:
ptr-declarator:
noptr-declarator
noptr-declarator:
( ptr-declarator )
(我省略了语法的其他细节)。从这一点可以看出,任何声明符都可以用括号括起来,并且仍然匹配相同的语法规则。这两个
返回(0)的原因相同
和返回0代码>工作。一些复杂的类型定义需要使用括号来声明,以便正确分组相关的修饰符。多余的括号通常会被忽略。它也适用于非原语。我认为您需要一个更好的示例或一个链接,以获得我们都真正感兴趣的答案。@HenriMenke事实上这不是同一个原因0
是一个表达式,但OP代码中的s
是一个声明器nice。我本来打算给OP一个语法摘要的参考。