3

诚然,我想不出任何理由为什么覆盖一元运算&符,但在https://stackoverflow.com/a/4542813/368896中,关于某些类的海报状态X

...除非 X 做了一些非常愚蠢的事情,比如重载一元 & 来返回这个

(注意:我假设此评论指的是&运算符返回this的事实,而不是覆盖&运算符本身的事实。)

当我想到那条评论时,我突然想到“返回这个”正是操作员所做的&——即使在多重继承的情况下也是如此。

鉴于人们可能永远不想覆盖一元运算&符,但是为什么让它返回this(如果您确实决定覆盖它)会很愚蠢?

4

2 回答 2

7

我突然想到“返回这个”正是 & 运算符所做的

你是对的,尽管 C++ 也禁止获取临时对象的地址

在您引用的问题的上下文中,这是关于确定对象是否是临时对象:

如果您实现自己的operator &返回this,您将通过告诉编译器&(expression)始终有效来绕过此保护。考虑:

struct foo
{
};

struct bar
{
    bar* operator&()
    {
        return this;
    }
};

template <typename T>
void test(const T*)
{
    // no temporaries, can't take address of temporary...right?
}

int main()
{
    foo x;
    test(&x); // okay, x is an lvalue

    /*
    test(&(foo())); // not okay, cannot take address of temporary
    */

    bar y;
    test(&y); // still okay, y is an lvalue

    test(&(bar())); // huh?! not taking address of temporary, calling operator&
}
于 2013-03-17T18:57:34.690 回答
2

它的用途确实非常有限。 例如,一个用例是智能指针,因为它们经常在 Direct3D 中用于包装IUnknown对象。

我假设您不熟悉 Direct3D,所以我将对此进行更多讨论。许多 Direct3D 类派生自IUnknown它们并在使用后必须调用Release. 是的,D3D 内部使用引用计数。人们往往会忘记打电话Release,这真的很乏味。所以一个人所做的就是将它包装IUnknown成一个smartpointer它将在幕后进行发布。

smart_pointer<ID3D11Device> device = // .. 

因此,通过声明&device您不想要 的地址smart_pointer<ID3D11Device>,您想要 的地址ID3D11Device

template <class T>
class com_ptr
{
private:
    T *inst;

public:
   // many other methods/overloadings

    T** operator & ()
    {
        return &inst;
    }
};

底线:这样,您可以Release在析构函数中调用,而不必在其余代码中关心它。

底线 2:更好的方法是添加一个get()返回实习生对象的方法。

    T** get()
    {
        return &inst;
    }
于 2013-03-17T18:47:18.933 回答