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

pyt*_*hor 4 c++ operator-overloading temporary-objects

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

struct A {
  A transform() const;
};

struct B {
  // returns a temporary A
  A operator*() const;
};
Run Code Online (Sandbox Code Playgroud)

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

dyp*_*dyp 5

免责声明:对于因将重载运算符的值类别从其内置对应项更改而引起的任何混淆,我概不负责。

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}}; }
};
Run Code Online (Sandbox Code Playgroud)

用法示例:

#include <iostream>

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

重要提示:作用于 in 的对象p->是一个左值,因为内置->函数应用于指针!例如,如果您transform使用 lvalue-ref 之类的限定符int transform() &;,则该版本(*p).transform()将无法编译,但p->transform()仍然是合法的。