7.1.5.1 cv限定符

来源:互联网 发布:js设置div字体颜色 编辑:程序博客网 时间:2024/05/16 07:13

7.1.5.1 cv限定符

1、共有两个cv限定符:constvolatile。如果cv限定符出现在decl-specifier-seq中,声明的init-declarator-list部分不能为空。[注:3.9.3讨论了cv限定符是如何影响对象和函数类型的]

2、在名字空间作用域中声明的const限定类型对象具有外部链接属性,除非对象是通过extern声明的,或者对象先前已被声明为外部链接。通过整型常量表达式初始化的非volatileconst限定的整型变量或枚举类型可当作整型常量表达式使用(5.19)。[注:如8.5所述, const限定类型的对象或子对象的定义必须包含初始化体,或者此定义可被缺省初始化。]

3、虽然指向cv限定类型的指针或引用并不要求所指对象确实是cv限定的,但却被当作确实如此;const限定的访问路径不能用于对对象进行修改,即使该对象并不是const对象,因而可通过其它访问路径进行修改。[注:cv限定符受类型系统的支持,在不进行转型(5.2.11)的情况下,它们的语义要求是不能被违反的。]

4、除被声明为mutable7.1.1)的const类成员可被修改外,任何在const对象的生命期(3.8)内试图对其进行修改的操作,其结果是未定义的。

5、例如:

const int ci = 3; // cv-qualified (initialized as required)

ci = 4; // ill-formed: attempt to modify const

int i = 2; // not cv-qualified

const int* cip; // pointer to const int

cip = &i; // OK: cv-qualified access path to unqualified

*cip = 4; // ill-formed: attempt to modify through ptr to const

int* ip;

ip = const_cast<int*>(cip); // cast needed to convert const int* to int*

*ip = 4; // defined: *ip points to i, a non-const object

const int* ciq = new const int (3); // initialized as required

int* iq = const_cast<int*>(ciq); // cast required

*iq = 4; // undefined: modifies a const object

6、另一个例子:

class X {

public:

mutable int i;

int j;

};

class Y {

public:

X x;

Y();

};

const Y y;

y.x.i++; //well-formed: mutable member can be modified

y.x.j++; //ill-formed: const-qualified member modified

Y* p = const_cast<Y*>(&y); // cast away const-ness of y

p->x.i = 99; // well-formed: mutable member can be modified

p->x.j = 99; // undefined: modifies a const member

7、如果试图通过非volatile限定类型的左值引用volatile限定类型的对象,程序的行为是未定义的。

8[注:volatile提示编译器不要对其限定的变量进行过度的(aggressive)优化,因为对象的值可能会以编译器无法检测到的方式改变。详细的语义参见1.9。总的来说,volatile的语义在C++C中是相同的。]