gpt4 book ai didi

C++ 范围 View 迭代器和运算符->

转载 作者:行者123 更新时间:2023-12-04 15:00:15 26 4
gpt4 key购买 nike

如果我执行转换 View 操作,我注意到 View 迭代器不支持运算符->。所以在代码方面

void transform_view( )
{
struct Z { int a; };

std::ranges::single_view view { Z { 99 } };

auto transform_view { std::ranges::views::transform( view, []( auto const& z ){ return Z { z.a + 10 }; } ) };

// The operator-> does not compile here as there is none defined
// auto transform_view_first_value { transform_view.begin( )->a };
}
这是“如预期的”,因为 24.7.6.3 中的标准定义了 range.transform.iterator 没有操作符->。
我发现这有点令人惊讶,并试图理解为什么它没有。我无法在标准或各种网站中找到和概述 View 迭代器的普遍预期,以及为什么特别是在其中至少有一些没有操作符->。
有没有人知道答案或有关此的良好信息来源?

最佳答案

简化,原型(prototype)为operator->是:

T* operator->();
为了创建这个运算符,你必须能够返回一个指向 T 的指针,并且这个指针在你从运算符返回后必须是有效的。因此,迭代器必须为该指针存储一个临时对象并控制其生命周期。
这会产生一些问题:
  • 迭代器被认为存储起来很便宜,但现在它们可能包含 T 的隐藏拷贝。
  • 它违背了设计原理之一:ranges cannot own elements .
  • 范围的设计准则之一是 adaptors are lazy evaluated ,所以对象会在 operator-> 时被创建叫做。对操作符的每次调用都应该销毁内部对象并返回一个新指针。如果我们决定将对象作为缓存保留,则必须在迭代器中添加更多逻辑来控制对象的生命周期和失效。

  • 它还提出了一些必须由标准回答的问题:谁拥有该对象?修改它是否安全?当迭代器被复制时会发生什么?当迭代器移动时会发生什么?指针何时失效?
    我想 operator->没有添加,因为它使实现更困难,但它没有添加任何改进:您可以使用 operator*实现相同的行为。但是,这个操作符返回的是T的一个拷贝,所以对象的所有者和它的生命周期是明确的。

    关于C++ 范围 View 迭代器和运算符->,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67063300/

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