C ++ 11 3.3.1p4 - 相同声明区域中的声明?

时间:2013-06-29 03:30:54

标签: c++ c++11 language-lawyer

在C ++ std 3.3.1p4中:

  

给定一个声明区域中的一组声明,每个声明区域指定相同的非限定名称,它们都应引用同一个实体。

在下面,不是同一声明区域中的两个int声明,指定相同的非限定名称,并引用两个不同的实体?

int main()
{
    int i;
    {
        int i;
    }
}

报价如何不适用并使其形成错误?

如果引用不适用于此,它适用于什么?

(请注意,第一个i的声明性区域确实包含第二个i,如3.3.1p2中的示例所示。)

1 个答案:

答案 0 :(得分:3)

它们不在同一声明区域中。内部i的声明性区域仅限于最内部的括号内。

事实上,3.3.1/2的代码与您自己的代码非常相似:

int j = 24;
int main() {
    int i = j, j;
    j = 42;
}

其中,用于设置j的{​​{1}}是i24的范围在j之后停止并重新启动,。这两个}变量是不同的,尽管它们位于文件声明区域中的原因与您的示例相同:re是两个声明区域。

由于没有单个声明性区域,因此范围可以控制。 j个州(我的大胆):

  

每个名称都在程序文本的某些部分中引入,称为声明性区域,这是该名称有效的程序的最大部分,也就是说,该名称可以用作非限定名称来引用同一个实体。通常,每个特定名称仅在称为其范围的程序文本的某些可能不连续的部分内有效。

     

声明的范围与其潜在范围相同,除非潜在范围包含另一个同名声明。在这种情况下,内部(包含)声明性区域中声明的潜在范围被排除在外部(包含)声明性区域中的声明范围之外。

C++11 3.3.1/1在这里很重要,内部possibly discontiguous(在你的例子中)“descopes”,或隐藏,外部i即使外部声明区域可能包围内部之一。