在C++性病3.3.1p4中:
给定单个声明区域中的一组声明,每个声明区域指定相同的非限定名称,它们都将引用同一个实体。
在下面,这两个int
声明是不是位于同一个声明区域,指定了相同的非限定名,并引用了两个不同的实体?
int main()
{
int i;
{
int i;
}
}
该报价如何不适用,并使这一不正确的形式?
如果引文不适用于此,它适用于什么?
(注意,第一个i
的声明性区域确实包含第二个i
,如3.3.1p2中的示例所示。)
发布于 2013-06-29 03:34:54
它们不在同一个声明性区域。内部i
的声明性区域仅限于最内部的大括号内。
实际上,3.3.1/2
的代码非常类似于您自己的代码:
int j = 24;
int main() {
int i = j, j;
j = 42;
}
在这方面,用于设置j
的i
是24
的24
,但是外部j
的作用域在,
之后停止,并在}
处重新启动。这两个j
变量是不同的,尽管它们位于文件声明区域中,原因与您的示例相同: re是两个声明区域。
因为没有一个声明性区域,所以范围起控制作用。C++11 3.3.1/1
声明(我的粗体):
每个名称都在程序文本的某一部分中引入,称为声明性区域,该区域是程序中该名称有效的最大部分,也就是说,该名称可用作引用同一实体的非限定名称。通常,每个特定名称仅在程序文本的某个(可能是不连续的部分)中有效,称为其作用域。 声明的范围与其潜在范围相同,除非潜在范围包含另一个同名声明。在这种情况下,声明在内部(包含)声明区域中的潜在范围被排除在外部(包含)声明区域的声明范围之外。
这里重要的是possibly discontiguous
,内部i
(在您的示例中) "descopes",或者隐藏外部i
,即使外部声明区域可能包含内部i
。
https://stackoverflow.com/questions/17376399
复制相似问题