看看之前关于SO的答案,似乎std::ostream
是不可移动的,而std::ofstream
应该是可移动的。但是,此代码
#include <fstream>
int main()
{
std::ofstream ofs;
std::ofstream ofs2{std::move(ofs)};
}
似乎无法在我尝试过的任何版本的gcc或clang中编译(使用--std=c++11或--std=c++14)。编译器错误略有不同,但下面是我针对gcc 4.9.0得到的结果
6 : error: use of deleted function 'std::basic_ofstream::basic_ofstream(const std::basic_ofstream&)'
根据标准,这是预期的行为吗?
请注意,之前也提出了一个非常类似的问题( Is std::ofstream movable? ),但标准似乎从那时起就发生了变化(如Why can't std::ostream be moved?中所述),使得这些答案过时了。当然,这些答案都不能解释为什么上面的代码不能编译。
在尝试使用ofstream
的容器时遇到了这个问题,由于上面的原因而无法工作。
发布于 2015-02-28 07:01:05
根据标准
27.9.1.11 basic_ofstream构造函数
或者,它更“可读”的版本是http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstream,std::basic_ostream<>
有一个move构造器,所以代码应该被编译。
clang++ 3.5使用-std=c++11
或-std=c++1y
对其进行编译。而且是gcc5编译的,所以对于小于5的gcc,可能没有在libstdc++中实现它
有趣的是,在gcc的stdlibc++实现https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014中没有提到移动语义的缺乏
感谢@BoBTFish指出,请参阅https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316获取错误报告。已确认该问题已在gcc5中修复。
https://stackoverflow.com/questions/28775673
复制相似问题