gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:53:26 25 4
gpt4 key购买 nike

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

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com