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