随笔分类 - C++标准
摘要:16 预处理指令1、预处理指令由预处理标记序列组成。序列的首标记为#预处理标记,它或者为源文件中的第一个字符(可位于不包含换行符的空白之后),或者位于至少包含一个换行符的空白之后。序列的最后一个标记是位于序列首标记之后的第一个换行符(因此,预处理指令通常被称为“行”。这些“行”没有其他的句法意义,在预处理中,除了某些情况之外(例如,参见16.3.2的字符串文字创建操作符#),所有的空白都是等价的)。preprocessing-file:groupoptgroup:group-partgroup group-partgroup-part:pp-tokensopt new-lineif-secti
阅读全文
摘要:1、在本国际标准中,程序文本被保存在称为源文件的单元内。一个源文件,加上通过预处理指令#include包含的头文件(17.4.1.2)和其他源文件(16.2),并除去被条件包含(16.1)预处理指令限定的代码行,称为翻译单元。[注:不需要对所有的C++程序单元同时进行翻译。]2、[注:翻译单元和实例单元的翻译结果可保存在一个独立的文件或是库文件中。程序中独立的翻译单元之间可通过(例如)调用标识符具有外部链接属性的函数、操作标识符具有外部链接属性的数据或操作数据文件进行通信。可对翻译单元逐个进行翻译,之后再将它们链接以生成可执行程序(3.5)。]2.1 翻译步骤1、下列步骤说明了翻译的先后次序。
阅读全文
摘要: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
阅读全文
摘要: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
阅读全文
浙公网安备 33010602011771号