声明性区域的实际定义是什么

时间:2014-05-15 16:56:57

标签: c++

标准引用,sec 3.3.1 / 1:

  

在名为a的程序文本的某些部分中引入了每个名称   声明性区域,这是程序中最大的部分   该名称有效,即该名称可用作其名称   非限定名称,指代同一实体。

并且有标准的例子,sec 3.3.1 / 2

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

标识符j被声明为名称两次(并使用两次)。该   第一个j的声明性区域包括整个例子。该   第一个j的潜在范围在j和之后立即开始   延伸到程序的末尾,但其(实际)范围不包括   和之间的文字。

但是这两段在声明性区域定义中是矛盾的,因为j可能不会在整个示例中使用,因为非限定名称ro指的是同一个实体

2 个答案:

答案 0 :(得分:2)

虽然定义有点模糊,但该术语的使用表明它意味着“该名称有效的程序的最大部分,如果没有被嵌套区域中具有相同名称的另一个实体隐藏” 。当然,如果外部实体被隐藏,名称仍然有效;标准定义的唯一问题是关于引用同一实体的一点。

实际上,这意味着整个命名空间,块或类定义(包括其成员定义),以及可能还有其他一些我现在无法想到的事情。

答案 1 :(得分:1)

C ++委员会试图做其他程序员无法理解标准的所有内容。此外,委员会公开无视委员会非成员提交的提案

如果不考虑这些令人困惑的语句并应用常识,则声明性区域可以是命名空间,函数范围或代码块范围等(例如类范围)。

第二个j的声明区域是函数的最外层代码块。实际上在标准中有书面

  

j的第二个声明的声明性区域(j   紧接在分号之前)包括{和。之间的所有文本   但是它的潜在范围不包括i的声明。

{和} 之间的所有文字”对应于该函数的最外层代码块。

因此声明性区域是声明变量并可以用作非限定名称的区域(命名空间,函数作用域,代码块作用域甚至函数参数作用域)。然而,它的潜在范围始于宣言。 因此,声明性区域总是大于或至少等于变量的潜在范围。