c++ - 为什么不需要将具有删除的拷贝构造函数的类型的移动构造函数标记为已删除?

标签 c++ c++11 constructor copy-constructor

考虑std::mutex。我了解std::mutex为什么不能移动。但是它的副本构造函数显然标记为已删除,但是我还没有看到它的move构造函数这样的声明。那么,为什么cppreference表示std::mutex是不可移动的?

根据文档(https://en.cppreference.com/w/cpp/language/move_constructor),有许多未满足的先决条件会阻止隐式move构造函数。但是我找不到这个问题的原因。谢谢您对此问题的帮助。

我真的不认为这个(en.cppreference.com/w/cpp/thread/mutex/~mutex)是std::mutex的用户定义的析构函数。

最佳答案

编译器未生成隐式move构造函数的原因有两个:

  • std::mutex可能具有用户定义的析构函数。在某些平台上,互斥对象分配内存,因此析构函数必须清理该内存,例如,通过调用pthread_mutex_destroy()
  • 复制副本构造函数被明确删除,该数量被视为“用户声明的”。

  • 那么,为什么以这样的方式编写标准,使得上述情况阻止生成隐式move构造函数?首先考虑一下您没有定义任何构造函数/析构函数/复制/移动运算符的类。然后整个类的行为就像成员变量的集合一样。在构造/销毁/复制/移动这样的集合时,逻辑上要做的就是将操作分别应用于每个项目。但是,一旦用户定义了这些操作,就会在类中添加新的语义,并且基本上,它不再仅仅是成员变量的集合。从查看用户定义的操作以隐式创建所有其他操作的 Angular 来看,编译器还不够聪明,因此安全的做法是不要隐式创建它们。

    关于c++ - 为什么不需要将具有删除的拷贝构造函数的类型的移动构造函数标记为已删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62370747/

    相关文章:

    c++ - 类变量 - 对齐

    c++ - 修复 QObject : Cannot create children for a parent that is in a different thread

    c++ - C++11 中的自动类型推导和类型转换有什么区别

    java - 在子类中初始化父类(super class)变量(构造函数中需要)

    c# - 这个冒号是什么(:) mean?

    javascript - 使用字符串 "constructor"作为 JavaScript 对象中的键

    c++ - 在 switch 语句中从 int 到 enum 类的隐式转换

    c++用指针反向打印数组内容 - 为什么这种方法有效?

    c++ - 为什么这种模式不能在成员函数中使用?

    c++ - 在 C++ 中查找小于特定整数值的最接近浮点值?