【问题标题】:Why can't I move std::ofstream?为什么我不能移动 std::ofstream?
【发布时间】:2015-04-30 18:59:00
【问题描述】:

查看之前关于 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的容器时遇到了这个问题,由于上述原因,它不起作用。

【问题讨论】:

  • 使用 --std=c++11 在 freebsd 上使用 Clang 3.4.1 编译良好。

标签: c++ c++11 gcc clang fstream


【解决方案1】:

按照标准

27.9.1.11 basic_ofstream 构造函数

或者,它更“可读”的版本http://en.cppreference.com/w/cpp/io/basic_ofstream/basic_ofstreamstd::basic_ostream&lt;&gt;有一个移动构造函数,所以代码应该编译。

clang++ 3.5 用-std=c++11-std=c++1y 编译它。 gcc5 也编译它,所以它可能没有在 libstdc++ 中为 gcc 实现

有趣的是,gcc 的 stdlibc++ 实现https://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.2014 没有提到缺少移动语义

请参阅https://gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 获取错误报告,感谢@BoBTFish 指出。已确认该问题已在 gcc5 中修复。

【讨论】:

  • gcc.gnu.org/bugzilla/show_bug.cgi?id=54316 请注意,在顶部它只提到了stringstream,但再往下很明显这也适用于ofstream。底部条目是“为 GCC 5 修复”。
  • 嗯,这似乎很确定。没有尝试过 gcc5,但确实使用gcc.godbolt.org 尝试了 clang 3.5,但它没有工作,猜测这是该站点的问题。感谢您的回答!
  • @toth 只是看了一眼链接中的代码,我发现您正在使用std::is_lvalue_reference_v。 AFAIK,C++11/14 中没有这样的using,所以你必须使用std::is_value_reference&lt;U&gt;::value。我知道,他们应该已经定义了它,类似于类型特征_t(来自&lt;&gt;::type
猜你喜欢
  • 1970-01-01
  • 2014-01-13
  • 2015-08-12
  • 2011-10-27
  • 2021-10-16
  • 2014-04-25
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
相关资源
最近更新 更多