在使自己熟悉C ++ 14规范的同时,我读到,如果一个类没有显式声明的Copy Constructor,Copy Assignment Operator,Move Constructor或Move Assignment Operator,则编译器应生成默认实现。
考虑线程安全的文件,这个空类:
class ThreadSafeFile
{
std::mutex m_mutex;
std::string m_FileName;
std::ofstream m_File;
};
当我尝试移动时,将其分配如下:
ThreadSafeFile file;
ThreadSafeFile file2 = std::move(file);
我收到此编译错误:
功能“ThreadSafeFile :: ThreadSafeFile(常量ThreadSafeFile&)”(隐式声明的)不能被引用 - 这是一个删除功能
为什么呢?
如果仔细看,std::mutex
将无法复制或移动。既然你无法移动或复制的一员,您的移动构造函数和拷贝构造函数被隐式删除。如果你想允许移动你的类,你可以随时使用std::unique_ptr
。
struct ThreadSafeFile {
std::unique_ptr<std::mutex> m_mutex;
string m_FileName;
std::ofstream m_File;
};
正如TC在评论中指出的那样,在某些情况下,实现移动除互斥对象以外的所有内容的move构造函数也是一种有效的解决方案。你可以在这里找到一个很好的例子:我应该如何应对活字互斥体在C ++?
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句