8.3 声明符的含义

8.3 声明符的含义

1、声明符列表出现在可选的(第7章)decl-specifier-seq7.1)之后。每个声明符只能包含一个declarator-id;它对被声明的标识符进行命名。除了特殊函数(12.3, 12.4, 13.5)声明、模板特化或局部特化(14.7)声明之外,declarator-id中的unqualified-id必须是简单标识符。此外,declarator-id只在以下情况才允许使用限定形式:在所属类之外定义成员函数(9.3)或静态数据成员(9.4);在所属名字空间之外定义或显式实例化函数或变量成员;在所属名字空间之外定义已声明的显式特化;声明其它类或名字空间的成员为友元函数(11.4)。一旦declarator-id被限定,那么声明必须指向在限定符所指的类或名字空间中声明的成员,并且这个成员不能是通过使用声明using declaration)引入的成员(如在下面的代码中关于int B::f()的定义)[注:如果限定符为全局作用域解析操作符::declarator-id指向在全局名字空间作用域中声明的名字。]例如:

namespace A

{

int f(){ return 0; };

};

 

namespace B

{

    using A::f;

};

 

int B::f()

{

    return 1;        

}

 

main()

{

    int a = A::f();

    int b = B::f();

}

根据标准,不能对类或名字空间引入的名字进行定义。所以上述代码中关于int B::f()的定义应该是非法的。然而vc6能顺利编译此代码,运行后main函数中ab的值都为0

2、(decl-specifier-seq中的auto, static, extern, register, mutable, friend, inline, virtual, typedef说明符直接作用于init-declarator-list中的每个declarator-id之上;declarator-id的类型由decl-specifier-seq和它的declarator共同决定。

3、因此,对于特定标识符的声明具有如下形式

              T D

其中Tdecl-specifier-seqD为声明符。下面是确定此声明中declarator-id的类型的递归过程。

4、首先,decl-specifier-seq确定了一个类型。在声明

              T D

中,声明说明符序列T确定了类型“T”。例如:在声明

              int unsigned i;

中,类型说明符int unsigned确定了类型“int unsigned”(7.1.5.2)。

5、对于声明T D,如果D是一个未修饰的标识符,那么此标识符的类型就是“T”。

6、对于声明T D,如果D具有形式

              ( D1 )

那么被包含的declarator-id的类型与下述声明所包含的declarator-id的类型相同:

              T D1

括号并不改变内嵌declarator-id的类型,但却能影响复杂声明符的绑定。

你可能感兴趣的:(C++标准)