在 C++ 中显式删除移动构造函数的用例 [关闭]

Posted

技术标签:

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

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

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

【问题讨论】:

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

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

【讨论】:

以上是关于在 C++ 中显式删除移动构造函数的用例 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GDAL ruby​​ 绑定中显式关闭数据集?

JavaScript中显式原型和隐式原型的联系

C++之继承与派生

c++类的构造函数不显式声明会自动生成吗

:: before array 在下面的代码中显式地在 C++ 中意味着啥? [复制]

私有成员是不是应该在惯用的 C# 中显式声明为私有? [关闭]