使 C++ return 中的重载成员访问运算符成为临时的

Making overloaded member access operator in C++ return a temporary

我想写 class 类似于下面,其中 IteratorLike 只能被取消引用到一个新值,因为迭代器提供了一个不同于底层结构的视图,使得 return 一个简单的参考是不可行的。

class IteratorLike
{
public:
    MyValue operator*() const { return MyValue(...); }
    auto operator->() const { return **this; } // This does not work generally due to member access semantics.
};

总而言之,我只想 IteratorLike()->x 的意思相同 (*IteratorLike()).x

可以简单地在 MyValue class 中重载 operator->(),但我希望它在所有情况下都能正常工作。 使用重载 operator->() 的包装器类型似乎是一个合理的解决方案,但在 returning 右值时这不起作用。 在 the example on godbolt 中是此类包装器的有效实现,包括由于悬挂引用而导致的未定义行为。

有没有办法让它工作?

如果包装器可以 return 一个指向纯右值的指针,那么在我看来,int &qa = MyIteratorLike()->x; 行会被编译器捕获,但这样的事情似乎是不可能的。

Is there a way to make this work?

没有。值类别是表达式的 属性,而不是类型。 "pointer to prvalue"不是东西