7.1.5.1 cv限定符
7.1.5 .1 cv限定符
1、共有两个cv限定符:const和volatile。如果cv限定符出现在decl-specifier-seq中,声明的init-declarator-list部分不能为空。[注:
2、在名字空间作用域中声明的const限定类型对象具有外部链接属性,除非对象是通过extern声明的,或者对象先前已被声明为外部链接。通过整型常量表达式初始化的非volatile但const限定的整型变量或枚举类型可当作整型常量表达式使用(5.19)。[注:如8.5所述, const限定类型的对象或子对象的定义必须包含初始化体,或者此定义可被缺省初始化。]
3、虽然指向cv限定类型的指针或引用并不要求所指对象确实是cv限定的,但却被当作确实如此;const限定的访问路径不能用于对对象进行修改,即使该对象并不是const对象,因而可通过其它访问路径进行修改。[注:cv限定符受类型系统的支持,在不进行转型(
4、除被声明为mutable(
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限定类型的对象,程序的行为是未定义的。