【问题标题】:Returning gsl::span from function从函数返回 gsl::span
【发布时间】:2020-04-21 14:21:09
【问题描述】:

我正在尝试打印从函数返回的跨度,但它没有捕获数据。如何正确地从函数返回跨度?

#include <gsl/span>
#include <iostream>
#include <memory>

gsl::span<int> res(){
    std::array<int, 3> str{100, 200,300};
    gsl::span<int> a{str};
    return gsl::span<int>(a.data(), a.size());
}
int main() {
    auto test{res()};
    for (const auto &i: test)
        std::cout << i << std::endl;
}

【问题讨论】:

  • 只有在span 引用的缓冲区仍然有效时,才能访问span 的内容。在这种情况下,它引用了一个超出范围的对象。所以你应该直接返回str,或者使用vector,或者实际提供存储的东西。

标签: c++ c++14 gsl


【解决方案1】:

问题是span 不拥有值,因此您返回悬空跨度。

您必须返回拥有该值的std::array(按值)。

【讨论】:

  • 另一种选择是在可以持续的地方创建数组,例如在堆上,然后返回跨度。但是你不应该忘记正确管理这个内存,即注意何时删除数组。
  • @Ruslan: static str 将是一个替代方案。分配返回span 是有问题的,因为我们不会期望必须删除span 的内容。 span 确实是一个视图,不应与所有权相关
  • 嗯,是的,我宁愿认为分配函数是管理该对象的某个类的方法,而不是调用者会删除跨度的指针。
  • 是否可以通过引用参数传递跨度并通过这种方式返回值
  • @tester123:不确定你的意思,但请记住,span 是一个没有所有权的单一视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
相关资源
最近更新 更多