gpt4 book ai didi

c++ - 为什么range::ostream_iterator默认可构造?

转载 作者:行者123 更新时间:2023-12-01 14:29:09 25 4
gpt4 key购买 nike

该问题遵循注释here中的讨论。

在Eric Niebler的ranges-v3 library(某种程度上已成为C++ 20标准的一部分)中,ranges::ostream_iteratordefault-constructible-没有ostream。

怎么来的?

我认为后来具有有效构造的“虚拟”构造是C++中的反模式,我们逐渐逐渐摆脱了这种疣。 std::ostream iterator can only be constructed with a stream(目前-在C++ 20之前)。而且,我们似乎无法使用默认构造的range::ostream_iterator做任何事情……所以,这有什么用呢?

最佳答案

这遵循类型应该如何表现的“编程元素”设计哲学。如果您听过“do as int s do”这句话,那就是哲学-类型应该是Regular。 EoP definition of Regular是:

T’s computational basis includes equality, assignment, destructor, default constructor, copy constructor, total ordering (or default total ordering) and underlying type



转换为真正的 C++20 concepts为:

template<class T>
concept Movable = is_object_v<T> && MoveConstructible<T> && Assignable<T&, T>
&& Swappable<T>;
template<class T>
concept Copyable = CopyConstructible<T> && Movable<T> && Assignable<T&, const T&>;
template<class T>
concept Semiregular = Copyable<T> && DefaultConstructible<T>;
template<class T>
concept Regular = Semiregular<T> && EqualityComparable<T>;


我们已经失去了总排序部分,而只支持 EqualityComparable,即使如此,通过Ranges进行的许多库需求实际上只需要 Semiregular而不是 Regular。但这仍然是这个想法的基础。

请注意,如果类型是可移动的,那么默认可构造就已经很有意义了。从概念上移出状态与默认构造状态非常相似。从那里不能做很多事情,但这是一个状态。

关于c++ - 为什么range::ostream_iterator默认可构造?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62942343/

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