不应重载取地址运算符
6.8.8 ID_overloadAddressOperator
重载的取地址运算符可以返回任意类型的数据,易被误用,非智能指针相关的基础类不应重载取地址运算符。
获取“不完整类型(incomplete type)”的对象地址时,如果其完整类型重载了取地址运算符,会导致标准未定义的行为。
示例:
struct X; // Incomplete type
X* foo(X& x) {
return &x; // Undefined behavior
}
struct X {
X* operator &(); // Non-compliant
};
X* bar(X& x) {
return &x; // Call ‘X::operator&’
}
例中 foo 会导致未定义的行为,可能会返回 x 对象的实际地址,而 bar 会调用重载了的取地址运算符,这是一种混乱的局面。
依据
ISO/IEC 14882:2003 5.3.1(4)-undefined
ISO/IEC 14882:2011 5.3.1(5)-undefined
参考
C++ Core Guidelines C.166
MISRA C++ 2008 5-3-3