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