c++ - 使 C++ 中的重载成员访问运算符返回临时值

标签 c++ iterator dereference value-categories

我想编写类似于下面的类,其中 IteratorLike只能取消引用到新值,因为迭代器提供了与底层结构不同的 View ,这使得返回简单引用不可行。

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意思相同 .

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

有办法让它工作吗?

如果包装器可以返回指向纯右值的指针,则 int &qa = MyIteratorLike()->x; 行根据我的理解,编译器会捕获它,但这样的事情似乎是不可能的。

最佳答案

Is there a way to make this work?

没有。值类别是表达式的属性,而不是类型的属性。 “指向纯右值的指针”不是一回事

关于c++ - 使 C++ 中的重载成员访问运算符返回临时值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59896703/

相关文章:

c++ - 我继承自 std::iterator,但编译器无法识别 'pointer' 或 'reference'

c++ - 使用 64 位包编译 32 位 Qt 应用程序

c++ - 在 C++ 中保存和加载大数组

c++ - SDL2 : Render engine design

C++ 为什么会输出错误的复利?

iterator - 我可以将 Iterator<Item=io::Result<u8>> 转换为 io::Result<Vec<u8>> 而不 panic 吗?

C++ 错误 : request for member 'view' in

C++:对于数组声明,&*A 不等同于 A?

ClojureScript Re-frame 订阅取消引用困境

pointers - 为什么打印指针与打印取消引用的指针打印相同的内容?