在Google C++样式指南中,有一个关于运算符重载的部分有一个奇怪的声明:
超载也有令人惊讶的后果.例如,您无法转发声明重载的类
operator&
.
这似乎不正确,我找不到任何导致GCC出现问题的代码.有谁知道那个陈述是指什么?
标准的5.3.1具有"可以采用不完整类型的对象的地址,但如果该对象的完整类型是将操作符&()声明为成员函数的类类型,则该行为是未定义的(并且没有需要诊断)."
我也不知道这一点,但正如另一张海报所指出的那样,很容易看出它如何导致编译器生成错误的代码.
我也没有听说过它,但这会给重载之前和之后的相同代码带来可能令人困惑的结果:
#includeclass Foo; void bar (Foo& foo) { std::cout << &foo << std::endl; } class Foo { public: bool operator & () { return true; } }; void baz (Foo& foo) { std::cout << &foo << std::endl; } int main () { Foo foo; bar(foo); baz(foo); return 0; }
输出:
0x7fff092c55df 1
虽然还有其他原因你不会这样做 - 重载地址 - 不能很好地与stl或更通用的代码.
我认为这个说法不准确.和其他答案一样,我猜这里.首先,我假设他们指的是一元运算符而不是二元运算符&.那是:
int x = 5; int* p = &x; // unary & if (x & 1) // binary &
您可以转发声明您想要的任何课程.但是,如果类重载一元运算符&,并且您调用一元运算符&指向其中一个对象的指针,您可能会得到不一致的行为(有时您只需获取地址,有时您将调用重载方法).这很容易变成几乎不可能调试的东西.
我很高兴fizzer实际上看了标准并且不仅仅是猜测.