我尝试通过扩展std::ifstream
的一个函数来更轻松地读取二进制变量,结果让我惊讶的是,使用using std::ifstream::ifstream;
并未继承移动构造函数。更糟糕的是,它被明确地删除了。
#include <fstream>
class BinFile: public std::ifstream
{
public:
using std::ifstream::ifstream;
//BinFile(BinFile&&) = default; // <- compilation warning: Explicitly defaulted move constructor is implicitly deleted
template<typename T>
bool read_binary(T* var, std::streamsize nmemb = 1)
{
const std::streamsize count = nmemb * sizeof *var;
read(reinterpret_cast<char*>(var), count);
return gcount() == count;
}
};
auto f()
{
std::ifstream ret("some file"); // Works!
//BinFile ret("some file"); // <- compilation error: Call to implicitly-deleted copy constructor of 'BinFile'
return ret;
}
我不想显式实现移动构造函数,因为这样感觉不对。问题:
- 为什么它被删除了?
- 它被删除有意义吗?
- 有没有一种方法可以修复我的类,使移动构造函数得到正确继承?
std::ifstream&
。继承在这里似乎有点过头了。 - Pete BeckerBinFile(BinFile&& other) : std::ifstream(std::move(other)) {}
不确定它和= default;
有何区别。 - Igor Tandetnik