Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;标准是否允许在括号中声明变量?_C++ - Fatal编程技术网

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一个语法摘要的参考。