可以随意移动,但不能随意复制

trivially moveable but not trivially copyable

本文关键字:随意 但不能 复制 移动      更新时间:2023-10-16

是否可以设置class type,即:

  • 平凡地移动可构造,但不是平凡地复制可构造,但仍然是复制可构造
  • 平凡的复制可构造,但不是平凡的移动可构造,但仍然是移动可构造
  • 平凡的复制可分配,但不是平凡的移动可分配,但仍然是移动可分配
  • 平凡地移动可分配,但不是平凡地复制可分配,但仍然是复制可分配
  • 平凡的copy/move-constructible,但不是平凡的copy/move-assignable,但仍然是copy/move-assignable,反之亦然
  • 等(如有)

?

它们会是什么样子?

这个问题对于开发类似std::variantstd::tuple的类是有意义的。

这个问题是在看完这篇文章后产生的。

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

这个问题对于开发类似std::variant的or是有意义的std:: tuple-like类

这里有三种类类型值得关注:

    <
  • 所有者类型/gh><
  • 常规类型/gh>
  • 其他类型(函数,互斥锁)

在下面的例子中,假设两者都赋值&构造后缀用于移动/复制。我将把不重要的操作称为clone-:

Owner Types:这些是Movable &可克隆(可选择深复制或浅复制)典型的例子是std::unique_ptr, std::shared_ptr

Regular Types(int-like):这些是Movable &Copy-able。典型的例子是int, std::vector。关于这些类型的更多细节可以在什么是"常规类型"中找到。在移动语义的上下文中?,《编程要素》

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

当你可以创建这样的类时,我认为它们更像是稀奇古怪的东西,而不是你在任何有用的场景中都会看到的东西。

我已经把std::vector放在常规类型而不是所有者类型中,即使std::vector管理内存,因为它的接口被设计成尽可能接近常规类型。通常可以为表面上是非规则的类型设计一个规则接口。在这种情况下,如果使用常规接口,对代码进行推理会更容易。

你需要更清楚5.

琐碎意味着(除其他事项外)不是用户提供的。因此,简单地显式地编写默认实现会让一些事情变得非常重要。

http://eel.is/c + +草案/类#类!平凡地复制,

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

相关文章: