重载的类型转换运算符需用 explicit 关键字限定
5.1.12 ID_missingExplicitConvertor
为了避免意料之外的类型转换,重载的类型转换运算符需用 explicit 关键字限定。
示例:
struct A {
....
operator char*(); // Non-compliant
};
A foo();
char* bar() {
return foo(); // Invalid address returned
}
例中 foo 返回临时对象,类型转换运算符被隐式调用,然而当 bar 返回后,临时对象被销毁,返回的指针是无效的。
将类型转换运算符用 explicit 关键字限定,有问题的代码便不会通过编译:
struct A {
....
explicit operator char*(); // Compliant
};
在类的接口设计中,应尽量减少隐式转换以避免不易察觉的问题。