即使类未定义构造函数,也无法在类上调用C ++默认移动赋值运算符

亚历山大Demerdzhiev

在使自己熟悉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&)”(隐式声明的)不能被引用 - 这是一个删除功能

为什么呢?

Guillaume Racicot

如果仔细看,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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章