首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么我不能移动std::ofstream?

为什么我不能移动std::ofstream?
EN

Stack Overflow用户
提问于 2015-02-28 06:48:41
回答 1查看 6K关注 0票数 21

看看之前关于SO的答案,似乎std::ostream是不可移动的,而std::ofstream应该是可移动的。但是,此代码

代码语言:javascript
复制
#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得到的结果

代码语言:javascript
复制
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的容器时遇到了这个问题,由于上面的原因而无法工作。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-28 07:01:05

根据标准

27.9.1.11 basic_ofstream构造函数

或者,它更“可读”的版本是http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstreamstd::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中修复。

票数 19
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28775673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档