1

在 C++ 标准 3.3.1p4 中:

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

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

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

报价如何不适用并使这种格式不正确?

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

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

4

1 回答 1

3

它们不在同一个声明区域中。内部的声明区域i被限制在最里面的大括号内。

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

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

在那,j用于设置i的是24一个,但该外部的范围在j之后停止,并在 重新启动}。这两个j变量是不同的,尽管它们位于文件声明区域中,原因与您的示例相同:有两个声明区域。

由于没有单一的声明区域,因此范围控制。C++11 3.3.1/1状态(我的粗体):

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

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

这在possibly discontiguous这里很重要,内部i(在您的示例中)“descopes”或隐藏外部,i即使外部声明性区域可能包含内部区域。

于 2013-06-29T03:34:54.037 回答