考虑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/