使用移动语义在构造函数中初始化 class 成员
using move semantics to initialize class member in constructor
我正在研究 C++ 中的多线程,我写了一个简单的 class,其中包含一个私有 std::mutex
对象,以便在调用成员函数时进行同步:
#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 可以移动但不能 copyed/assigned。
所以我为 class 提供了一个移动构造函数(编译器不会自动生成):
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 Mutex types [thread.mutex.requirements.mutex]
3
The mutex types shall be DefaultConstructible and Destructible . If initialization of an object of a
mutex type fails, an exception of type system_error shall be thrown. The mutex types shall not be copyable
or movable.
如果你想让你的 class 移动可构建,那么你需要在某些时候添加另一层间接,例如使用 std::unique_ptr<std::mutex>
.
我正在研究 C++ 中的多线程,我写了一个简单的 class,其中包含一个私有 std::mutex
对象,以便在调用成员函数时进行同步:
#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 可以移动但不能 copyed/assigned。
所以我为 class 提供了一个移动构造函数(编译器不会自动生成):
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 Mutex types [thread.mutex.requirements.mutex]
3 The mutex types shall be DefaultConstructible and Destructible . If initialization of an object of a mutex type fails, an exception of type system_error shall be thrown. The mutex types shall not be copyable or movable.
如果你想让你的 class 移动可构建,那么你需要在某些时候添加另一层间接,例如使用 std::unique_ptr<std::mutex>
.