平凡可移动但不可轻易复制

时间:2016-09-21 04:36:04

标签: c++ c++11 c++14 typetraits

是否可以制作类类型,即:

  • 简单易于构建,但不是简单的可复制构造,但仍可复制构造
  • 简单地复制可构造,但不是简单的移动构造,但仍然可移动构造
  • 简单地复制 - 可分配,但不是简单的移动 - 可分配,但仍可移动 - 可分配
  • 简单地移动 - 可分配,但不是简单的可复制,但仍可复制 -
  • 简单地复制/移动构造,但不是简单的复制/移动可分配,但仍然可以复制/移动 - 可分配,反之亦然
  • 等(如果有的话)

它们会是什么样子?

这个问题对于开发,比如std::variant - 或类似std::tuple - 类似的问题是有意义的。

在查看this article之后出现了这个问题。

2 个答案:

答案 0 :(得分:1)

回答我认为你问题的核心:

  

这个问题对于开发,比如std :: variant-like或者是有意义的   std :: tuple-like class

这里有3种 class-types 值得关注。

  • 所有者类型
  • 常规类型
  • 其他类型(功能,互斥体)

以下假设分配&移动/复制存在构造后缀。我将非平凡的操作称为克隆 - :

所有者类型:这些是Movable&可克隆(深拷贝或浅拷贝是可以做出的选择) 陈规定型的例子是std::unique_ptr, std::shared_ptr

常规类型(类似int):这些是Movable&拷贝能力。 陈规定型的例子是int,std :: vector。 有关这些类型的更多详细信息,请访问What is a "Regular Type" in the context of move semantics?&在编程元素中。

其他类型(函数,互斥体等):这些类型拒绝被放入上面的一个干净的类中,例如。函数可以指代指针,带有捕获的lambda等。

当你可以创建这样的类时,关于所有其他可复制/可移动的组合,我认为它们更像是好奇心而不是你将在任何有用场景中看到的东西。 / p>

我已将std :: vector放在常规类型而不是所有者类型中,即使std::vector管理内存,因为其界面设计为接近一个普通的类型。您通常可以为表面非常规的类型设计 Regular 接口。在这种情况下,如果使用常规接口,则可以更轻松地推理代码。

答案 1 :(得分:-2)

  1. 你需要在5上更清楚。

    琐碎意味着(除其他外)不是用户提供的。因此,简单地明确地编写默认实现需要从简单到非平凡的东西。

    http://eel.is/c++draft/class#class!trivially可复制

    http://eel.is/c++draft/class.copy#25