【发布时间】:2016-10-18 14:06:50
【问题描述】:
在我的 API 中,我有一个返回 std::istringstream 的函数。std::istringstream class 是不可复制的,但支持移动,因此在符合要求的编译器上返回本地 std::istringstream 没有问题。
但是,在 gcc 4.9 上,no support 用于移动 std::istringstream。
是否有一些解决方法可以让我使用 std::istringstream 而无需从用户的角度更改 API?
建议的解决方法 here,使用 unique_ptr<std::istringstream> 将改变 API 的语义。
【问题讨论】:
-
如果您无法更改返回类型,我看不出如何解决。
-
好吧,假设我使用
auto获取结果(或者只是将其用作临时结果)-因此您可以返回其他内容。我现在认为可以创建一个具有相同接口的包装器并将其返回。 -
包装器会遇到同样的问题。您无法将流移动到包装器中,也无法复制它,那么如何将包装器从函数中取出?
-
因为无论如何这是一种解决方法,一位同事建议我可以复制包装器copy-ctor(或move-ctor)中的ios状态和流缓冲区。这将使代码在较旧的编译器上正常工作,但有一些潜在的性能成本。如果他不发布他的解决方案,我会的。
-
那么不要使用 4.9。这就是所提出问题的答案。
标签: c++ c++11 gcc move-semantics gcc4.9