04 2006 档案
摘要:8.3 声明符的含义1、声明符列表出现在可选的(第7章)decl-specifier-seq(7.1)之后。每个声明符只能包含一个declarator-id;它对被声明的标识符进行命名。除了特殊函数(12.3, 12.4, 13.5)声明、模板特化或局部特化(14.7)声明之外,declarator-id中的unqualified-id必须是简单标识符。此外,declarator-id只在以下情况才允许使用限定形式:在所属类之外定义成员函数(9.3)或静态数据成员(9.4);在所属名字空间之外定义或显式实例化函数或变量成员;在所属名字空间之外定义已声明的显式特化;声明其它类或名字空间的成员为友
阅读全文
摘要:8.2 歧义消解1、由函数式转型和6.8所述声明(声明符以左括号开头)的相似性而引起的歧义也会出现在声明的上下文中。这时,构造体可能为参数名被冗余的圆括号括起来的函数声明(如int f(int (n))),也可能是具有函数式转型初始化体的对象声明(如int n(int(1.0)))。同6.8一样,歧义消解的方案是将任何能当作声明的构造体看作是一个声明(比如:优先将int (n)看作是对int型变量n的声明,而不是对变量n的强制整型转换;这样导致的一个直接后果是将int f(int (n))解析为函数声明,而不是被n初始化的整型变量f的声明。)。[注:也可通过下列方法对一个可能会引起上述歧义的声
阅读全文
摘要:8.1 类型名1、进行显式类型转换,或作为sizeof,,new和typeid的参量时,需要指定类型的名字。类型名字可通过type-id给出,type-id在句法上等同于省略了名字的对象或函数声明。type-id:type-specifier-seq abstract-declaratoropttype-specifier-seq:type-specifier type-specifier-seqoptabstract-declarator:ptr-operator abstract-declaratoroptdirect-abstract-declaratordirect-abstract-
阅读全文
摘要:8 声明符1、声明中的声明符声明了一个对象、函数或类型。出现在声明中的init-declarator-list是一个由逗号分隔的声明符序列,其中的每个声明符可具有一个初始化体。init-declarator-list:init-declaratorinit-declarator-list , init-declaratorinit-declarator:declarator initializeropt2、声明由说明符(decl-specifier-seq; 7.1)和声明符(init-declarator-list)两个部分构成。说明符给出了被声明对象、函数或类型定义的类型、存储类和其它属性
阅读全文
摘要:6.8 歧义消解1、在包含表达式语句和声明的语法中存有歧义:以函数式显示类型转换(5.2.3)为最左子表达式的表达式语句可能无法同第一个声明符以左括号开头的声明区分开来。在这种情况下,语句是一个声明(即当一个语句即能为表达式语句又能为声明语句的时候,优先把它当成是声明语句)。 [注:为了消歧,可能需要检查整个语句以确定其为一个表达式语句还是声明。许多例子都可用此法消除歧义。例如:假定T为simple-type-specifier(7.1.5),T(a)->m = 7; // expression-statementT(a)++; //expression-statementT(a,5)&
阅读全文
摘要:7.3.2 名字空间别名1、名字空间别名定义根据下述语法为名字空间声明了一个可替代的名字:namespace-alias:identifiernamespace-alias-definition:namespace identifier = qualified-namespace-specifier ;qualified-namespace-specifier:::opt nested-name-specifieropt namespace-name2、namespace-alias-definition中的标识符为qualified-namespace-specifier所指名字空间的名字的
阅读全文
摘要:7.3 名字空间1、名字空间是一个名字可选的声明区域(未命名的名字空间也是合法的)。借助名字空间的名字可访问在名字空间中声明的实体,也就是名字空间的成员。与其它的声明区域不同,名字空间的定义可以由分布在一个多个翻译单元中的多个分立部分组成。2、翻译单元的最外层声明区域是一个名字空间;参见3.3.5。7.3.1 名字空间定义1、名字空间定义的语法为:namespace-name:original-namespace-namenamespace-aliasoriginal-namespace-name:identifiernamespace-definition:named-namespace-d
阅读全文
摘要:7.2 枚举声明1、枚举是一种由命名常量构成的独立类型(3.9.1)。在其作用域内,其名字被称为枚举名。enum-name:identifierenum-specifier:enum identifieropt { enumerator-listopt }enumerator-list:enumerator-definitionenumerator-list , enumerator-definitionenumerator-definition:enumeratorenumerator = constant-expression // 带初始化体的枚举符定义enumerator:identi
阅读全文
摘要:5.2.4 伪析构函数调用1、在点号.或箭头->之后的pseudo-destructor-name代表了由type-name命名的非类类型的析构函数。pseudo-destructor-name只能用作函数调用操作符()的操作数,此类调用的结果为空类型,它的唯一作用在于计算点号或箭头前面的后缀表达式。例如: typedef int I; I x = 10; x.I::~I(); // or x.~I(); x = 20;上面的x.I::~I();语句其实是调用了int类型的析构函数,但这并不会销毁x对象,x对象还能正常使用,x.I::~I();在此处并无实质作用。另外,如果将x.I::~
阅读全文
摘要:5.2.3 显式类型转换(函数式记法)1、后跟被圆括号括起来的表达式列表的简单类型说明符(7.1.5)构造了给定表达式列表的指定类型值。如果表达式列表为单个表达式,这个类型转换表达式等价于相应的转型(强制类型转换)表达式(5.4)。如果简单类型说明符指定一个类类型,这个类类型必须是完全的。如果表达式列表指定了多个值,类型必须为具有适当构造函数(8.5, 12.1)的类,并且表达式T(x1, x2, …)在效用上等价于声明T t (x1, x2, …);其中t为编译器引入的临时变量,表达式的结果等于t的右值。2、对于非数组完全对象类型或(可能cv限定的)空类型的简单类型说明符(7.1.5.2)T
阅读全文
摘要:函数定义或声明时叫参数(parameter),函数调用时则称参量(argument)。如:int f(int a);main(){ int i = 0; f(i);}其中i称为参量,a称为参数。参量通常称为实参(actual argument),参数则称为形参(formal parameter)。
阅读全文
摘要:5.2.2 函数调用1、存在两类函数调用:普通函数调用和成员函数(9.3)[注:静态成员函数(9.4)为普通函数。]调用。函数调用是一个后跟圆括号的后缀表达式,其中圆括号内或者为空,或者是通过逗号分隔的表达式列表,这个表达式列表组成了函数的参量。对于普通函数调用来说,后缀表达式或者是一个引用函数的左值(在这种情况下,不对后缀表达式进行函数-指针标准转换(4.3)),或者是一个指向函数类型的指针。如果函数通过具有语言链接属性的函数类型的表达式调用,当此语言链接属性与被调用函数的函数类型的语言链接属性不同时,函数的调用行为是未定义的(7.5)。对于成员函数调用来说,后缀表达式应该为隐式或显式的类成
阅读全文
摘要:5.2 后缀表达式1、后缀表达式从左至右组合。postfix-expression:primary-expressionpostfix-expression [ expression ] // 下标postfix-expression ( expression-listopt ) // 函数调用simple-type-specifier ( expression-listopt )typename ::opt nested-name-specifier identifier ( expression-listopt )typename ::opt nested-name-specifier t
阅读全文
摘要:12.3 转换1、类对象的类型转换可由构造函数和转换函数指定。这些转换称为用户定义的转换,可用于隐式类型转换(第4章)、初始化(8.5)和显式类型转换(5.4,5.2.9)。2、只有不存在歧义(10.2,12.3.2)的时候才能使用用户定义的转换。转换遵从访问控制规则(第11章)。访问控制在歧义消解(3.4)之后应用。3、[注:有关转换在函数调用中的使用可参见13.3和下面的例子。]4、最多只能有一个用户定义的转换(构造函数或转换函数)能隐式地应用于单个值。例如:class X {// ...public:operator int();};class Y {// ...public:opera
阅读全文
摘要:7.1.5.3 详细类型说明符elaborated-type-specifier:class-key ::opt nested-name-specifieropt identifierclass-key ::opt nested-name-specifieropt templateopt template-idenum ::opt nested-name-specifieropt identifiertypename ::opt nested-name-specifier identifiertypename ::opt nested-name-specifier templateopt te
阅读全文
摘要:7.1.5.2 简单类型说明符1、简单类型声明符为simple-type-specifier:::opt nested-name-specifieropt type-name::opt nested-name-specifier template template-id(此处的template应该是可选的,因为定义std::list<int> l;和std::template list<int> l;都是合法的)charwchar_tboolshortintlongsignedunsignedfloatdoublevoidtype-name:class-nameenum
阅读全文
摘要:7.1.5.1 cv限定符1、共有两个cv限定符:const和volatile。如果cv限定符出现在decl-specifier-seq中,声明的init-declarator-list部分不能为空。[注:3.9.3讨论了cv限定符是如何影响对象和函数类型的]2、在名字空间作用域中声明的const限定类型对象具有外部链接属性,除非对象是通过extern声明的,或者对象先前已被声明为外部链接。通过整型常量表达式初始化的非volatile但const限定的整型变量或枚举类型可当作整型常量表达式使用(5.19)。[注:如8.5所述, const限定类型的对象或子对象的定义必须包含初始化体,或者此定义
阅读全文
摘要:7.1.5 类型说明符1、类型说明符包括type-specifier:simple-type-specifierclass-specifierenum-specifierelaborated-type-specifiercv-qualifier一个通用的规则是:在声明的decl-specifier-seq中至多只允许出现一种类型说明符。以下情况例外:——const或者volatile可以和其它类型声明符结合使用。但是,冗余的cv限定符是不允许的,除非是被类型定义(7.1.3)或模板类型参量(14.3)引入,在这种情况下冗余的cv限定符被忽略。——signed和unsigned可以和char,l
阅读全文
浙公网安备 33010602011771号