繁体   English   中英

为什么 (C++) 类型是常规的是个好主意?

[英]Why is it a good idea for (C++) types to be regular?

这个问题源于关于 stream 迭代器的更具体的问题。)

如果满足以下条件,则称类型 [Stepanov, McJones] 为Regular

  • 它是相等可比较的
  • 它是可分配的(来自该类型的其他值)
  • 它是可破坏的
  • 它是默认可构造的(即无需参数即可构造)
  • 它的值有一个(默认)总排序

(还有一些关于“底层类型”的措辞,我不太明白。)

一些/许多人声称,在设计类型时——例如,对于 C++ 的标准库——努力使这些类型规则化是值得的,甚至是重要的,可能会忽略总顺序要求。 有人提到格言:

int那样做。

事实上, int类型满足所有这些要求。 但是,默认可构造类型在构造时会持有某种 null、无效或垃圾值 - int就是这样。 一种不同的方法要求在构建时进行初始化(并在销毁时取消初始化),以便对象的生命周期与其生存时间相对应。

为了对比这两种方法,人们或许可以考虑一种 T 指针类型,以及一种 T 引用或 T 引用包装器类型。 指针基本上是规则的(排序假定线性地址空间),并且有需要注意的nullptr 在引擎盖下,引用是一个指针——但你不能只构造一个无引用或垃圾引用。 现在,指针可能有它们的位置,但我们更喜欢使用引用(或者可能是可分配的引用包装器)。

那么,为什么我们应该更喜欢设计(作为库作者)和使用常规类型呢? 或者至少,我们为什么要在这么多情况下更喜欢它们?

我怀疑这是最重要的答案,但你可以说“没有未初始化的状态”/“没有垃圾值”是一个不适合移动分配的原则:在你从你的价值中移动之后,并采取它的资源消失了 - 它留在什么 state 中? 它与默认构造它相距不远(除非移动分配基于某种交换;但是那么 - 你可以看看移动构造)。

反驳是:“好吧,所以我们不要让这种类型的移动可分配,只有移动可破坏”; 不幸的是 - C++ 在 2000 年代的某个时候决定使用非破坏性移动到 go。 另请参阅@HowardHinnant 的这个问题和答案:

为什么 C++ 移动语义离开构造的源?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM