【发布时间】:2013-01-16 09:57:54
【问题描述】:
我有以下简单的类:
class Source
{
public:
Source() = default;
Source(Source const&) = delete;
Source(Source&&) = default;
explicit Source(std::string const& fileName)
: inputStream(fileName), path_(fileName)
{}
~Source() = default;
auto path() const -> std::string
{
return this->path_;
}
std::ifstream inputStream;
private:
std::string path_;
};
auto main(int argc, char* argv[]) -> int
{
Source source(Source("test.txt"));
cout << source.path() << "\n";
return 0;
}
根据cppreference ifstream 有一个move 构造函数,但是当我尝试用MinGW 4.7.2 编译它时,出现以下错误:
..\src\main.cpp:32:46:错误:使用已删除的函数 'cy::Source::Source(cy::Source&&)' 在包含的文件中 ..\src\main.cpp:10:0: source.hpp:28:5: 注意: 'cy::Source::Source(cy::Source&&)' 被隐式删除,因为 默认定义格式错误:source.hpp:28:5: error: use of 删除函数'std::basic_ifstream::basic_ifstream(const std::basic_ifstream&)' c:\mingw\bin../lib/gcc/mingw32/4.7.2/include/c++/fstream:420:11: 注意:'std::basic_ifstream::basic_ifstream(const std::basic_ifstream&)' 被隐式删除,因为默认 定义格式不正确: c:\mingw\bin../lib/gcc/mingw32/4.7.2/include/c++/fstream:420:11: 错误:使用已删除的功能 'std::basic_istream::basic_istream(常量 std::basic_istream&)'
我做错了吗?还是 cppreference 的文档不准确?还是 GCC 4.7.2 有 bug?
【问题讨论】:
-
移动构造函数没有被删除,复制构造函数被删除。
-
尝试源码 source(Source("source.txt"));即使您当前的代码是等效的,我相信也需要 operator= 是可访问的。
-
@SethCarnegie,感谢您的提示,但它也不起作用,gcc 仍然说移动构造函数被隐式删除。
-
只是还没有实现,see here。所有的流都是
Missing move and swap operations。 -
使用
std::unique_ptr<std::ifstream>是一种解决方法。