gpt4 book ai didi

c++ - 在没有 move 构造函数的情况下返回不可复制对象的解决方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:37 24 4
gpt4 key购买 nike

在我的 API 中,我有一个返回 std::istringstream 的函数.
std::istringstream class是不可复制的,但支持 move ,因此在符合标准的编译器上返回本地没有问题 std::istringstream .

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

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

最佳答案

如果你不能 move std::istringstream , 没有太多办法解决它。

如果对象不可复制且不可 move ,则不能按值返回它。如果您想支持新功能,您最好为这些功能获取一个新的编译器。

在用餐期间,您可以返回 unique_ptr .如果您真的很想按值返回,您可以返回一个包含 std::unique_ptr<std::istringstream> 的可 move 包装器并提供与 istringstream 相同的接口(interface)。但是,这也会影响返回类型。


通过右值引用返回可能很诱人。您可以执行以下操作:

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++ - 在没有 move 构造函数的情况下返回不可复制对象的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40110466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com