为什么无需将“ std :: mutex”的运动构造函数标记为已删除?

问题描述 投票:1回答:1

为什么没有必要将std::mutex的运动构造函数标记为已删除?

我完全理解为什么std::mutex不可移动。但是我还有一个问题。它的副本构造函数明确标记为已删除,但我尚未看到其运动构造函数的此类声明。那么为什么cppreference表示std::mutex不可移动?

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

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

c++ c++11 constructor c++17 copy-constructor
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.