gpt4 book ai didi

c++ - 为什么 output_iterator 概念不需要 output_iterator_tag?

转载 作者:行者123 更新时间:2023-12-01 13:06:44 27 4
gpt4 key购买 nike

C++20 为标准库中不同类型的迭代器(输入、输出、转发、双向、随机访问等)引入了适当的概念。
虽然这些类型的原始命名要求没有提到 the iterator tags from std::iterator_traits 总之,新的 C++20 概念明确要求它们。例如参见 input_iterator概念 ( [iterator.concept.input] ):

template<class I>
concept input_iterator =
input_or_output_iterator<I> &&
indirectly_readable<I> &&
requires { typename ITER_CONCEPT(I); } &&
derived_from<ITER_CONCEPT(I), input_iterator_tag>;
注意最后一行中对迭代器标签的检查。所有迭代器概念都会像这样检查相应的标签, except output iterator .
输出迭代器在这方面一直很特别, since the early days of the Ranges TS :

Unlike the output iterator requirements in the C++ standard,OutputIterator in the Ranges TS does not require that the iteratorcategory tag be defined.


对输出迭代器进行这种特殊处理的原因是什么?

最佳答案

在 C++20 中,迭代器类别通常根据语法自动检测。显式使用迭代器标签仅用于选择退出或选择加入:

  • 一切都弱于random_access_iterator_tag用于选择退出更强的迭代器类别(例如,输入迭代器可能在语法上与前向迭代器无法区分);
  • contiguous_iterator_tag用于选择加入 contiguous_iterator ,因为连续性是一种相对罕见的属性,也无法在语法上检测到。

  • 输出迭代器不需要这种细粒度的控制——你可以或不能写入它,这是在语法上检测到的。

    至于何时提供选择加入/选择退出, Casey Carter explained :
    • Passing an argument to a library component that constrains that argument is an implicit claim that the argument either doesn't satisfythe constraint (doesn't meet the syntactic requirements) or that itdoes model the constraint (meets the syntax and the semanticrequirements) so opt-in/opt-out are not generally necessary.

    • opt-in/opt-out facilities are only provided when we want to enable the library to assume that an argument that models some concept Xadditionally models some refinement Y of X when it satisfies Y. (I'vebeen calling this "semantic promotion", but it's not awell-established term.) The choice of opt-in vs. opt-out depends onthe expected frequency of false positives.


    “语义提升”通常在非输出迭代器参数上完成。输出迭代器没有什么可提升的。

    关于c++ - 为什么 output_iterator 概念不需要 output_iterator_tag?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62848334/

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