当前位置:  开发笔记 > 编程语言 > 正文

"你不能转发声明重载运算符的类&"?

如何解决《"你不能转发声明重载运算符的类&"?》经验,为你挑选了3个好方法。

在Google C++样式指南中,有一个关于运算符重载的部分有一个奇怪的声明:

超载也有令人惊讶的后果.例如,您无法转发声明重载的类 operator&.

这似乎不正确,我找不到任何导致GCC出现问题的代码.有谁知道那个陈述是指什么?



1> fizzer..:

标准的5.3.1具有"可以采用不完整类型的对象的地址,但如果该对象的完整类型是将操作符&()声明为成员函数的类类型,则该行为是未定义的(并且没有需要诊断)."

我也不知道这一点,但正如另一张海报所指出的那样,很容易看出它如何导致编译器生成错误的代码.



2> Pete Kirkham..:

我也没有听说过它,但这会给重载之前和之后的相同代码带来可能令人困惑的结果:

#include 

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;
}

输出:

0x7fff092c55df
1

虽然还有其他原因你不会这样做 - 重载地址 - 不能很好地与stl或更通用的代码.



3> Max Lybbert..:

我认为这个说法不准确.和其他答案一样,我猜这里.首先,我假设他们指的是一元运算符而不是二元运算符&.那是:

int x = 5;
int* p = &x; // unary &
if (x & 1)   // binary &

您可以转发声明您想要的任何课程.但是,如果类重载一元运算符&,并且您调用一元运算符&指向其中一个对象的指针,您可能会得到不一致的行为(有时您只需获取地址,有时您将调用重载方法).这很容易变成几乎不可能调试的东西.


我很高兴fizzer实际上看了标准并且不仅仅是猜测.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有