代码之家  ›  专栏  ›  技术社区  ›  Tomilov Anatoliy

可移动但不可复制

  •  2
  • Tomilov Anatoliy  · 技术社区  · 9 年前

    是否可以创建类类型,即:

    • 琐碎的移动可构造,但不是琐碎的复制可构造,但是仍然可以复制可构造
    • 琐碎的复制可构建,但不是琐碎的移动可构建,而是移动可构建
    • 琐碎地复制可分配,但不琐碎地移动可分配,但是仍然移动可分配
    • 普通移动可分配,但普通复制不可分配,但是仍可以复制可分配
    • 琐碎的复制/移动是可构造的,但不是琐碎的可复制/移动可分配的,但仍然可以复制/移动分配的,反之亦然
    • 等(如有)

    ?

    他们看起来怎么样?

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

    这个问题是在仔细研究之后提出的 this article .

    2 回复  |  直到 9 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

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

    这个问题对于开发std::variant like或 std::tuple-like类

    有三种 类类型 这里所关注的是,即。

    • 所有者类型
    • 常规类型
    • 其他类型(函数、互斥)

    在下文中,假设两者都分配;存在用于移动/复制的构造后缀。我将把非常重要的操作称为clone-:

    所有者类型: 这些是可移动的;可克隆(可以选择深度复制或浅层复制) 刻板印象的例子有 std::unique_ptr, std::shared_ptr

    常规类型(类似int): 这些是可移动的;可复制。 典型的例子是int、std::vector。 What is a "Regular Type" in the context of move semantics? &在编程元素中。

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

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

    我已将std::vector放入 常规类型 而不是 所有者类型 尽管 std::vector 管理内存,因为其接口设计为尽可能接近常规类型。您通常可以设计一个 有规律的 表面上是 非正规 。在这种情况下,如果使用常规接口,就更容易推理代码。

        2
  •  -2
  •   xaxxon    9 年前

    你需要在5点更加清楚。

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

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