重载运算符 - >当operator *返回临时值时

时间:2014-02-25 23:15:10

标签: c++ operator-overloading temporary-objects

我有两个具有以下结构的类:

struct A {
  A transform() const;
};

struct B {
  // returns a temporary A
  A operator*() const;
};

*运算符在这里可能看起来有点奇怪,但鉴于其使用的上下文实际上非常自然。实际上,B确实存在只是为嵌入式语言提供一些合成糖,因此它的方法和运算符旨在为代码提供所需的外观。鉴于B b,获取关联的A的速度很快,*b。我有时想立即调用A上的变换。目前,这需要一些额外的括号(*b).transform()。似乎是一种自然的简化,即b->transform()。但operator ->应该返回指针,operator *返回临时值。我怎样才能实现这样的重载?

1 个答案:

答案 0 :(得分:3)

免责声明:对于因重载运营商的价值类别从内置对应方改变而产生的任何混淆,我不承担任何责任。

struct just_some_type
{
    int m;

    int transform() { return m; }
};

// the intermediate helper stops the recurring application of ->
// if the lhs of -> is of a class type
struct intermediate_helper
{
    just_some_type member;

    just_some_type* operator->() { return &member; }
};

struct ptr_like
{
    just_some_type operator*()
    { return {42}; }

    intermediate_helper operator->()
    { return {{42}}; }
};

用法示例:

#include <iostream>

int main()
{
    auto p = ptr_like{};
    std::cout << (*p).transform() << "\n";
    std::cout << p->transform() << "\n";
}

重要说明: p->中作用的对象是左值,因为内置的->应用于指针!例如。如果您使用transform等左值参考符合int transform() &;,则版本(*p).transform()将无法编译,但p->transform()仍然合法。