c++ 在移动语义的上下文中是什么是“常规类型”?

Alex Stepanov defined Regular Types作为满足复制和平等的某些属性的类型。现在,C11已将移动语义添加到泛型编程的领域,Stepanov的定义已经不复存在了。我正在寻找一个很好的参考常规类型,包括他们与移动语义的交互。
最佳答案
概要:

对于C 11,我将包括:

> move-ctor(noexcept)
> move-assign(noexcept)
>总排序(自然总顺序的运算符<())和std :: less&#;如果是自然的
总订单不存在)。
哈希<>

并会删除:

> swap()(非投掷) – 替换为移动操作。

评论

Alex重新审视了Elements of Programming中的常规类型的概念。实际上,这本书的大部分内容都专门用于常规类型。

There is a set of procedures whose inclusion in the computational
basis of a type lets us place objects in data structures and use
algorithms to copy objects from one data structure to another. We call
types having such a basis regular, since their use guarantees
regularity of behavior and, therefore, interoperability. Section 1.5 of EoP

在EoP中,Alex介绍了一个底层类型的概念,它给了我们一个可以用来移动的非投掷交换算法。一个底层类型的模板在C中不能在任何特别有用的甘露中实现,但是您可以使用非抛出(noexcept)move-ctor和move-assign作为合理的近似值(底层类型允许从临时移动到没有额外的破坏为临时)。在C 03中,提供非抛出交换()是推荐的近似移动操作的方法,如果您提供move-ctor和move-assign,则默认的std :: swap()将足够(尽管您仍然可以实现更有效率)。

[我是on record,建议您使用单个赋值操作符,传递值,以覆盖move-assign和copy-assign。不幸的是,当一个类型获取默认的move-ctor时,当前的语言规则会导致它与复合类型相冲突。在语言修复之前,您需要编写两个赋值运算符。但是,您仍然可以使用传递值进行其他接收器参数,以避免组合处理所有参数的移动/复制。 ]

亚历克斯还增加了总订单的要求(尽管可能没有一个自然的总订单,订单可能是纯粹的代表)。应该为自然总排序保留运算符<()。我的建议是专门化std :: less<>()如果一个自然的总排序不可用,那么在标准中有一些先例)。

在EoP中,Alex放宽了对平等的要求,使代表性的平等足够。一个有用的改进。

常规类型也应该是等同的完成(即,operator ==()可以作为非朋友,非成员函数实现)。等同完整的类型也是可序列化的(尽管没有规范的序列化格式,但实现流操作符除了调试之外几乎没有用)。等同完成的类型也可以被散列。在C 11(或TR1)中,您应该提供std :: hash的专业化。

常规类型的另一个属性是area(),它还没有任何标准语法 – 除了测试之外,可能没有什么理由实际实现。这是一个用于指定复杂性的有用的概念,我经常实现它(或近似)来测试复杂性。例如,我们将复制的复杂度定义为复制对象区域的时间。

常规类型的概念不是语言特定的。在提供新语言时,我所做的第一件事就是说明这种语言中常规类型的显示方式。

转载注明原文:c++ 在移动语义的上下文中是什么是“常规类型”? - 代码日志