const、volatile 限定指针类型的别名是可疑的
6.2.2 ID_qualifierForPtrAlias
如果用 const、volatile 限定指针类型的别名,很可能会造成意料之外的错误。
示例:
struct Type {
void foo();
void foo() const;
};
typedef Type* Alias;
void bar(const Alias a) { // Rather suspicious
a->foo(); // Calls ‘void Type::foo();’
}
例中 Alias 是 Type* 的别名,“const Alias a”很容易引起误解,好像对象是不可被改变的,但实际上 a 的类型是 Type *const,const 限定的是指针而不是指针指向的对象,对象仍可被修改,其调用的函数也可能与预期不符。
应避免为指针类型定义别名,否则应提供常量和非常量两种别名,如:
typedef Type* Alias;
typedef const Type* ConstAlias;
void bar(ConstAlias a) {
a->foo(); // Calls ‘void Type::foo() const;’
}
注意,如果用 const、volatile 限定引用的别名则是错误的,详见 ID_qualifierInvalid。