C++ 从函数返回gsl::span
我试图打印从函数返回的范围,但它没有捕获数据。如何正确地从函数返回范围C++ 从函数返回gsl::span,c++,c++14,gsl,C++,C++14,Gsl,我试图打印从函数返回的范围,但它没有捕获数据。如何正确地从函数返回范围 #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&
#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;
}
#包括
#包括
#包括
gsl::span res(){
std::数组str{100200300};
gsl::span a{str};
返回gsl::span(a.data(),a.size());
}
int main(){
自动测试{res()};
用于(常数自动&输入:测试)
std::cout问题是span
没有自己的值,所以返回悬空span
您必须返回std::array
(按值)它拥有值。只有当span
引用的缓冲区保持有效时,才能访问span
的内容。在这种情况下,它引用的对象超出了范围。因此,您应该直接返回str
,或者使用vector
,或者实际提供存储的东西。另一个选项是创建将数组放在某个地方,例如堆上,然后返回span。但是,您不应该忘记正确管理此内存,即注意何时删除数组。@Ruslan:static str
将是另一种选择。分配以返回span
是有问题的,因为我们预计不必进行反编译删除span的内容span
。span实际上是一个视图,不应该与所有权相关。是的,我认为分配函数是某个类的一个方法,它将管理这个对象,而不是调用方将删除span的指针。是否可以通过引用参数传递span并通过该m返回值eans@tester123:不确定您的确切意思,但请记住,span是一个没有所有权的单一视图。