C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 在没有移动ctor的情况下返回不可复制对象的解决方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的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的情况下返回不可复制对象的解决方法所遇到的程序开发问题。

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。