Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 强制gsl::as_span返回gsl::span<;常数T>;?_C++_Templates_Guideline Support Library - Fatal编程技术网

C++ 强制gsl::as_span返回gsl::span<;常数T>;?

C++ 强制gsl::as_span返回gsl::span<;常数T>;?,c++,templates,guideline-support-library,C++,Templates,Guideline Support Library,给定以下函数,取:只读浮动范围(动态或任何静态大小): 以上内容无法编译。显然,gsl::as_span()返回一个gsl::span。除了不理解为什么隐式转换到gsl::span是不可能的之外,还有没有办法强制gsl::as_span()返回只读span?在您链接到的github页面上浏览gsl/span.h,我发现了下面的as_span重载,我相信就是这里调用的: template <typename Cont> constexpr auto as_span(Cont&

给定以下函数,取:只读浮动范围(动态或任何静态大小):


以上内容无法编译。显然,
gsl::as_span()
返回一个
gsl::span
。除了不理解为什么隐式转换到
gsl::span
是不可能的之外,还有没有办法强制
gsl::as_span()
返回只读span?

在您链接到的github页面上浏览gsl/span.h,我发现了下面的
as_span
重载,我相信就是这里调用的:

template <typename Cont>
constexpr auto as_span(Cont& arr) -> std::enable_if_t<
    !details::is_span<std::decay_t<Cont>>::value,
    span<std::remove_reference_t<decltype(arr.size(), *arr.data())>, dynamic_range>>
{
    Expects(arr.size() < PTRDIFF_MAX);
    return {arr.data(), narrow_cast<std::ptrdiff_t>(arr.size())};
}

但不幸的是我自己无法测试。让我知道这是否有效。

因为\u span
不再是MS/GSL的一部分,可能是因为
GSL::span
最近与
std::span
对齐,现在可以与C++20一起使用

您可以使用
std::as_const
获取一个const容器,并从中创建一个
gsl::span
(或者在您的情况下使用
gsl::as_span


默认情况下,跨度的长度为
动态范围
,因此可以接受任何长度的跨度。当然,您在编译时没有可用的长度。

foobar
更改为
foobar(const gsl::span&x)
对您有用吗?它可能会编译,但我认为gsl建议对只读跨距使用span?非常量元素的常量范围不同于常量元素的非常量范围。我想让界面说:span中的元素是不可变的。我不知道GSL库,我很欣赏这两种类型之间的区别。我不知道这种差异对你是否重要。啊,没问题。不确定您是否这样做(有关GSL的更多信息,请访问)。但是,是的,区别对于这个问题很重要:)是的,这是有效的!实际上,我的
foobar
可能需要两到三个跨距,所以这是一个有点麻烦的解决方法,但是,嘿,它做到了!你可以随时制作自己的函数
,就像为你做的那样。就这么做了,哈哈。谢谢
std::vector<float> v = {1, 2, 3};
foobar(gsl::as_span(v));
template <typename Cont>
constexpr auto as_span(Cont& arr) -> std::enable_if_t<
    !details::is_span<std::decay_t<Cont>>::value,
    span<std::remove_reference_t<decltype(arr.size(), *arr.data())>, dynamic_range>>
{
    Expects(arr.size() < PTRDIFF_MAX);
    return {arr.data(), narrow_cast<std::ptrdiff_t>(arr.size())};
}
 const auto & cv = v;
 foobar(as_span(cv));
foobar(gsl::span<const float>(std::as_const(v)));
void foobar(gsl::span<const float> x);