加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 06:52:39 所属栏目:百科 来源:网络整理
导读:在我的API中,我有一个返回std :: istringstream的函数. std::istringstream class是不可复制的,但支持在符合标准的编译器上移动,返回本地std :: istringstream没有问题. 但是,在gcc 4.9上,移动std :: istringstream有no support. 是否有一些解决方法,我可以
在我的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受影响较小的方式.除此之外,我不知道任何解决方法.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读