gpt4 book ai didi

c++ - 箭头运算符(operator->)解引用时的返回类型(operator*)按值返回

转载 作者:可可西里 更新时间:2023-11-01 16:37:57 26 4
gpt4 key购买 nike

我正在编写一个 InputIterator,它实现了 operator* 和 operator-> 等。

我的运算符* 返回一对对( vector )元素的引用。因此,运算符*按值返回。

根据cppreference:

The overload of operator -> must either return a raw pointer, or return an object (by reference or by value) for which operator -> is in turn overloaded.

那我返回什么?

我不能返回原始指针;这对必须以某种方式物理归还。那么可能是一些带有 operator-> 定义的包装器?它是否存在于标准库中,或者它通常是如何完成的?

最佳答案

template<class T>
struct fake_ptr_with_value {
T t;
T* operator->() { return std::addressof(t); }
};

返回 fake_ptr_with_value<decltype(**this)> .

std 没有公开这样的助手类型.

请注意,由于各种迭代器类要求的规范存在缺陷,这仅适用于 InputIterator。秒。根据标准,前向迭代器(以及所有更强大的迭代器,如随机访问迭代器)需要 operator*返回对真实稳定对象的引用。

缺陷是标准 (a) 在某些情况下需要引用,而伪引用可以做到,(b) 混合了“迭代”和“解引用”语义。

Rangesv3 有一个更解耦的迭代器类别系统,可以解决部分(如果不是全部)这些缺陷。

因为这个问题是关于输入迭代器的,所以这个解决方案就足够了;我只是包括这个警告,以防有人想在其他地方使用这种技术。您的代码可能会编译并且看起来可以工作,但是当您将迭代器传递给任何 std 时,您几乎肯定会违反 C++ 标准的要求。函数,这意味着您的程序格式错误,无需诊断。

关于c++ - 箭头运算符(operator->)解引用时的返回类型(operator*)按值返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52856168/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com