3.3.1 - [basic.scope.pdecl] - 【基本.作用域.声明点】

原创 2004年11月02日 21:17:00
请不要转载本文;请不要以任何形式重新出版,发布本文;请在下载本文 24 小时内将其删除;禁止将本文用于商业目的。

3 Basic concepts [basic]

3.3 Declarative regions and scopes [basic.scope]

3.3.1 Point of declaration [basic.scope.pdecl]

 

3 基本概念 【基本】

3.3 定义区域和作用域 【基本.作用域】

3.3.1 声明点 【基本.作用域.声明点】

 

The point of declaration for a name is immediately after its complete declarator (clause 8) and before its initializer (if any), except as noted below. [Example:

    int x = 12;
    { int x = x; }

Here the second x is initialized with its own (indeterminate) value. ]

 

除了下面注解的情况外,某名字的声明点在其声明符(章节 8)完成后立即开始,并在其初始化符之前(如果有的话)。【例:

    int x = 12;
    { int x = x; }

第二个 x 被其自己的值(不确定的)初始化。】

 

[Note: a nonlocal name remains visible up to the point of declaration of the local name that hides it. [Example:

    const int  i = 2;
    { int  i[i]; }

declares a local array of two integers. ]]

 

注:非局部名字保持其可见性直到隐藏它的局部名字的声明点。【例:

    const int  i = 2;
    { int  i[i]; }

声明了一个两个整数的局部数组。】】

 

The point of declaration for an enumerator is immediately after its enumerator-definition. [Example:

    const int x = 12;
    { enum { x = x }; }

Here, the enumerator x is initialized with the value of the constant x, namely 12. ]

 

枚举符的声明点在枚举符定义后立即开始。【例:

    const int x = 12;
    { enum { x = x }; }

此处,枚举符 x 被常数 x 初始化,就是 12。】

 

After the point of declaration of a class member, the member name can be looked up in the scope of its class. [Note: this is true even if the class is an incomplete class. For example,

    struct X {
        enum E { z = 16 };
        int b[X::z];                // OK
    };

--end note]

 

在类成员的声明点之后,该成员名可以在其类作用域中被查找到。【注:即使该类不完整也是如此。例如,

    struct X {
        enum E { z = 16 };
        int b[X::z];                // 可以
    };

--注完

 

The point of declaration of a class first declared in an elaborated-type-specifier is as follows:
  • for an elaborated-type-specifier of the form

        class-key identifier ;

    the elaborated-type-specifier declares the identifier to be a class-name in the scope that contains the declaration, otherwise

  • for an elaborated-type-specifier of the form

        class-key identifier

    if the elaborated-type-specifier is used in the decl-specifier-seq or parameter-declaration-clause of a function defined in namespace scope, the identifier is declared as a class-name in the namespace that contains the declaration; otherwise, except as a friend declaration, the identifier is declared in the smallest non-class, non-function-prototype scope that contains the declaration. [Note: if the elaborated-type-specifier designates an enumeration, the identifier must refer to an already declared enum-name. If the identifier in the elaborated-type-specifier is a qualified-id, it must refer to an already declared class-name or enum-name. See 3.4.4. ]

 

如下情况,类的声明点由一个详细类型限定词首先声明:
  • 对于具有如下形式的详细类型限定词

        类-关键字 标识符 ;

    详细类型限定词标识符声明为包含该声明的作用域中的一个类-名称,另外

  • 对于具有如下形式的详细类型限定词

        类-关键字 标识符

    如果详细类型限定词在名字空间作用域中定义的函数的声明-限定词-序列参数-声明-子句中出现,则标识符被声明为包含该声明的名字空间中的类-名称;另外,除非作为友元声明,该标识符被声明于不是类作用域,不是函数原型作用域的包含该声明的最小作用域中。【注:如果详细类型限定词指定枚举,则该标识符必须指代已经声明的枚举-名称。如果详细类型限定词中的标识符是一个限定-标识符,它必须指代已经声明的类-名称枚举-名称。参见 3.4.4。】

 

[Note: friend declarations refer to functions or classes that are members of the nearest enclosing namespace, but they do not introduce new names into that namespace (7.3.1.2). Function declarations at block scope and object declarations with the extern specifier at block scope refer to declarations that are members of an enclosing namespace, but they do not introduce new names into that scope. ]

 

【注:对函数或类的友元声明指代其最近的包含其的名字空间中的成员,但它们不向名字空间中引入新的名字(7.3.1.2)。在块作用域中的函数声明和在块作用域中带有 extern 限定词的对象声明指代包含其的名字空间成员,但它们不向该作用域中引入新名字。】

 

[Note: For point of instantiation of a template, see 14.7.1. ]

 

注:模板实例化点,参见 14.7.1。】

 

PREV [basic.scope] | NEXT [basic.scope.local] 上一页 【基本.作用域】 | 下一页 【基本.作用域.局部】

js函数作用域和声明提前

说到作用域,首先来认识一下常见的两个作用域。 块级作用域(block scope):在一些类c的编程语言中,花括号内的每一段代码都具有各自的作用域。 函数作用域(function scope):j...
  • CodeHao
  • CodeHao
  • 2014年12月02日 19:45
  • 1204

C++类的定义之作用域

(继上一篇) 每个类都定义了自己的新作用域和唯一的类型。在类的定义体内声明内成员,将成员名引入类的作用域。两个不同的类具有两个不同的类作用域。 例如: Class First { int me...
  • bbzhang522
  • bbzhang522
  • 2012年05月31日 16:59
  • 3973

C++变量作用域和声明周期(整理)

对一个C++变量来说,有两个属性非常重要:作用域和生命周期,它们从两个不同的维度描述了一个变量–时间和空间。顾名思义,作用域就是一个变量可以被引用的范围,如:全局作用域、文件作用域、局部作用域;而生命...
  • fenxinzi557
  • fenxinzi557
  • 2016年08月10日 10:35
  • 922

GO声明和作用域

作用域go语言一共有如下几个作用域: 全局作用域:所有的关键字和内置类型、函数都拥有全局作用域 package作用域:一个包中声明的变量、常量、函数、类型等都拥有包作用域,在同一个包中可以任意访问 文...
  • sydnash
  • sydnash
  • 2016年12月06日 10:49
  • 542

js变量的声明、作用域以及闭包

1、变量的声明 使用var多次声明同一个变量,是合法的,不会因此语法的错误;重复的声明并初始化变量值,只是相当于普通的赋值语句。读取一个未声明的变量值,js会产生一个错误。尝试给一个未经var ...
  • xiaowu_hhb
  • xiaowu_hhb
  • 2016年10月11日 15:56
  • 409

Golang学习笔记:语言规范之声明与作用域

类型声明包括:常量、自定义类型、变量、函数、标签、还有包声明。 程序中的标识符都必须声明。块、包、文件中的标识符不能重复。Declaration = ConstDecl | TypeDecl |...
  • scherrer
  • scherrer
  • 2015年10月17日 15:22
  • 730

关于js的闭包 匿名函数和作用域的几个小点

今天看到js的闭包那一章,被例子搞的头大:首先是关于闭包中的自由变量:var result=[]; function foo(){ var i= 0; for (;i...
  • qa84643685
  • qa84643685
  • 2016年05月07日 17:06
  • 855

命名空间、using声明和using指示【附送彩蛋】

一般来说,使用using声明总是对的,使用using指示总是会带来风险的。using指示引发的二义性错误只有在使用了冲突的名字的地方才能被发现。这种延后的检测意味着可能在特定库引入很久很久之后,才爆发...
  • friendbkf
  • friendbkf
  • 2015年04月21日 20:19
  • 1336

关于模板声明及其定义

2011-03-13  09:46:38 模板,包括模板函数及有成员函数的模板类,其声明连同定义都应该放在.h文件中!但这并非因为它们的作用域是全局的! 模本(包括其定义)本身对于编译器而言,等同于其...
  • hudaorong
  • hudaorong
  • 2011年03月13日 09:46
  • 675

JavaScript中的作用域以及this变量

今天我想简单讨论下关于Javascript的作用域和this变量。“作用域”的概念就是说,我们的代码能够从哪里去访问某些函数或者变量,也就是它们所存在的上下文,或者说就是它们被执行的地方。第一种作用域...
  • zlxadhkust
  • zlxadhkust
  • 2014年04月26日 11:05
  • 1059
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:3.3.1 - [basic.scope.pdecl] - 【基本.作用域.声明点】
举报原因:
原因补充:

(最多只允许输入30个字)