【问题标题】:Use case of explicit deletion of move constructor in C++ [closed]在 C++ 中显式删除移动构造函数的用例 [关闭]
【发布时间】:2020-07-30 23:07:45
【问题描述】:

我了解移动构造函数,但在某些地方我看到移动构造函数被删除。在什么情况下删除移动构造函数有用/有意义?

即使对象需要单例,我们也可以删除复制构造函数,但不能删除移动构造函数。

【问题讨论】:

  • 不确定最后一部分是什么意思。如果您删除复制构造函数,则移动构造也将自动禁用,除非您明确重新启用它。如果您确实为单身人士启用移动构造...... Wowie-zowie 那会很糟糕。单例可能会被移动破坏并使其处于可以安全销毁但无法使用的状态。
  • 我不明白。为什么不能删除移动构造函数?你有minimal reproducible example吗?
  • 如果您允许移动构造,这意味着您可以拥有多个 Singleton 实例,即使其中只有一个实例可用。单例模式意味着有一个可广泛访问的实例,并且允许它移动可能会使该实例不可用。如果允许移动赋值,则意味着在多个实例之间移动一个值,这也与单例模式相反。
  • 如果一个类型因为它有一个不可复制的成员而隐式不可复制,那么你可以通过删除移动构造和赋值来避免任何复制或赋值。
  • @FrançoisAndrieux 感谢您的回复。我当时认为 std::move() 可以在参数上调用移动构造函数,并且我假设对 std::move 的调用将破坏源(调用正在传递的参数的析构函数)。现在我了解到 std::move 只是静态转换为 R 值引用类型。谢谢

标签: c++ c++11 c++14 move


【解决方案1】:

它通常不需要,除非是为了冗长。只是“可以不意味着应该”的一个例子。在您删除复制构造函数(甚至刚刚定义)的示例中,移动构造函数被隐式删除。在完成此操作的场景中,您可以想象显式删除移动构造函数。

【讨论】:

    猜你喜欢
    • 2018-03-26
    • 1970-01-01
    • 2018-08-30
    • 2014-03-19
    • 2011-10-09
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多