使用 Move 语义在构造函数中初始化类成员



我正在研究C++的多线程,我写了一个简单的类,其中包含一个私有std::mutex对象,当调用成员funcrion时要同步:

#include <mutex>
#include <iostream>
class SynchClass
{
public:
    SynchClass() {}
    void inline SynchronizedInterfaceFunction();    
private:
    std::mutex mMutex;
};
void inline SynchClass::SynchronizedInterfaceFunction()
{
    std::lock_guard<std::mutex> lock(mMutex);
    for (int i = 0; i < 10; i++) 
        std::cout << "thread n: " << std::this_thread::get_id() << " inside function" << std::endl; 
    std::cout << std::endl;
}

现在,我这个函数有一个 delete d 复制构造函数和复制赋值运算符,因为 std::mutex 可以移动但不能复制/分配。

所以我为类提供了一个移动构造函数(编译器不会自动生成(:

class SynchClass
    {
    public:
        // ... other members as before
        SynchClass(SynchClass &&rhs) : mMutex(std::move(rhs.mMutex)) {}
    };

但是当我广告这一行时,编译器抱怨我正在尝试调用std::mutex的已删除副本构造函数:

In file included from main.cpp:5:0:
SynchClass.h: In constructor 'SynchClass::SynchClass(SynchClass&&)':
SynchClass.h:8:61: error: use of deleted function 'std::mutex::mutex(const std::mutex&)'
  SynchClass(SynchClass &&rhs) : mMutex(std::move(rhs.mMutex)) {}
                                                             ^
In file included from C:/Program Files/mingw64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/mutex:43:0,
                 from main.cpp:2:
C:/Program Files/mingw64/lib/gcc/x86_64-w64-mingw32/7.2.0/include/c++/bits/std_mutex.h:97:5: note: declared here
     mutex(const mutex&) = delete;

但我正在使用 std::move 将左值转换为右值,因此应该调用 std::mutex 的移动构造函数。

我错过了什么?

std::mutex不可

复制且不可移动。它没有移动构造函数或赋值。mutex的库要求:

33.4.3.2 互斥类型 [thread.mutex.requirements.mutex]
3 互斥锁类型应为 默认可构造 和 可破坏 。如果初始化的对象 互斥锁类型失败,应引发类型 system_error 的异常。互斥锁类型不可复制 或可移动。

如果要使类移动可构造,则需要在某个时候添加另一层间接寻址,例如通过使用std::unique_ptr<std::mutex>

最新更新