一元 & 运算符是否有特殊规则?
例如,下面这段代码:
#include <iostream>
struct X
{
X() {}
void* operator &() { return NULL; }
};
int main()
{
const X x;
std::cout << &x << std::endl;
X y;
std::cout << &y;
}
产生输出结果
0xbfbccb33
0
我知道这段代码会像这样编译和运行,因为之前在这里讨论过,但如果我不知道的话,我本来会预期编译失败,因为 operator &
没有声明为 const
。
看起来编译器会生成 operator &() const
,无论是否重载了 operator &()
。很好,这很有道理,特别是与示例和输出一致。
问题是,在标准中详细说明了这种行为吗?
我不想要重复我在问题中已经陈述的答案,请不要解释我的重载运算符不能在一个 const
对象上调用,因为我已经知道。
&
时应该使用std::addressof
/boost::addressof
,要么就根本不应该重载operator&
。从形式上讲,前者是正确的(依赖于&
获取地址的代码应该记录必须这样做),实际上,后者是正确的(将具有重载operator&
的类型传递到该代码中的人违反了隐式接口)。 - Steve Jessop