c – 在没有移动ctor的情况下返回不可复制对象的解决方法

c – 在没有移动ctor的情况下返回不可复制对象的解决方法,第1张

概述在我的API中,我有一个返回std :: istringstream的函数. std::istringstream class是不可复制的,但支持在符合标准的编译器上移动,返回本地std :: istringstream没有问题. 但是,在gcc 4.9上,移动std :: istringstream有no support. 是否有一些解决方法,我可以使用std :: istringstream而 在我的API中,我有一个返回std :: istringstream的函数.
std::istringstream class是不可复制的,但支持在符合标准的编译器上移动,返回本地std :: istringstream没有问题.

但是,在gcc 4.9上,移动std :: istringstream有no support.
是否有一些解决方法,我可以使用std :: istringstream而无需从用户的角度更改API?

解决方法建议here使用unique_ptr< std :: istringstream>将改变API的语义.

解决方法 如果你不能移动std :: istringstream,那就没什么办法了.

如果对象不可复制且不可移动,则无法按值返回.
如果要支持新功能,最好为这些功能获取新的编译器.

在meatime中,您可以返回unique_ptr.如果你真的渴望按值返回,你可以返回一个包含std :: unique_ptr< std :: istringstream>的可移动包装器.并提供与istringstream相同的接口.但是,这也会影响返回类型.

通过右值参考返回可能很诱人.这是你可以做的:

struct MyAPIClass {    std::istringstream&& get_stream() {        return std::move(*_stream);    }private:    std::unique_ptr<std::istringstream> _stream;};

然后,使用旧的编译器,您可以像这样使用它:

std::istringstream&& stream = myAPIClass.get_stream();// use stream as long as myAPIClass exists

使用新编译器的人将能够像这样使用它:

std::istringstream stream = myAPIClass.get_stream();// use stream normally

这是API受影响较小的方式.除此之外,我不知道任何解决方法.

总结

以上是内存溢出为你收集整理的c – 在没有移动ctor的情况下返回不可复制对象的解决方法全部内容,希望文章能够帮你解决c – 在没有移动ctor的情况下返回不可复制对象的解决方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1224876.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-05
下一篇2022-06-05

发表评论

登录后才能评论

评论列表(0条)

    保存