C++ Error C2280 尝试引用已删除的函数
学习C++的右值引用的时候,发现一个错误
1>e:\work\jutiltest\jutiltest\main.cpp(88): error C2280: “MyString::MyString(const MyString &)”: 尝试引用已删除的函数
1>e:\work\jutiltest\jutiltest\main.cpp(72): note: 编译器已在此处生成“MyString::MyString”
1>e:\work\jutiltest\jutiltest\main.cpp(72): note: “MyString::MyString(const MyString &)”: 因为“MyString”有一个用户定义的 移动赋值运算符,所以已隐式删除函数
MMP,半小时没搞清楚为什么,最后发现。。。
这种情况的原因是构造函数被C++11编译器的安全考虑下,被删除了,从而找不到构造函数,因而报错。
我重载了一个移动赋值运算符
那么在C++11的标准中,编译器会自动将默认拷贝构造函数(MyString(MyString& str))删除,以防止出现浅拷贝等不确定行为,等同于MyString(MyString& str) = delete;
此时如果用户不自定义一个拷贝构造函数,那么在拷贝构造对象时,则无法找到构造函数
修复方法:自定义一个拷贝构造函数或者移动构造函数
于是便解决了问题!
(还有一个其他类似的情况,比如我的某一个类内含有一个ifstram对象,但是我构造时进行了一个赋值,后出发同样的错误)
1>e:\work\jutiltest\jutiltest\main.cpp(19): error C2280: “Jutil::BinaryPrintFile::BinaryPrintFile(const Jutil::BinaryPrintFile &)”: 尝试引用已删除的函数
1>f:\lib\jutil\jutil.h(45): note: 编译器已在此处生成“Jutil::BinaryPrintFile::BinaryPrintFile”
1>f:\lib\jutil\jutil.h(45): note: “Jutil::BinaryPrintFile::BinaryPrintFile(const Jutil::BinaryPrintFile &)”: 因为 数据成员 调用已删除或不可访问的函数“std::basic_ifstream<char,std::char_traits>::basic_ifstream(const std::basic_ifstream<char,std::char_traits> &)”,所以已隐式删除函数
1>c:\program files (x86)\microsoft visual studio\2017\community\vc\tools\msvc\14.16.27023\include\fstream(944): note: “std::basic_ifstream<char,std::char_traits>::basic_ifstream(const std::basic_ifstream<char,std::char_traits> &)”: 已显式删除函数
其原因是因为构造函数中的这一句
this->is = std::ifstream();
将一个ifstream拷贝赋值给了类中的成员,查阅ifstream源代码,发现了问题,ifstream中的拷贝构造函数是=delete的(不允许拷贝构造)
可能是IO安全着想…
总之,就是不能拷贝构造了,所以会导致错误
修复方法:算了不拷贝构造了,我直接new吧,改成这样
this->is = new std::ifstream();
记得改成员为指针,然后注意释放,就完活儿了
解决问题!
记之备忘