我曾经使用指南支持库中的 gsl::span 工作了一段时间。使用 gsl::span,可以定义一个采用静态范围并使用动态范围的 gsl::span 调用它的函数,例如
void f(gsl::span<int, 5> s) { }
...
std::vector<int> v(100);
f(gsl::make_span(v).subspan(42, 5)); // Works
Run Code Online (Sandbox Code Playgroud)
将代码移植到 std::span 后,我注意到这不再可能:
void f(std::span<int, 5> s) { }
...
std::vector<int> v(100);
f(std::span(v).subspan(42, 5)); // Does not work
Run Code Online (Sandbox Code Playgroud)
这种差异有什么原因吗?是否有任何推荐的方法可以将具有动态范围的 std::span 转换为具有固定范围的 std::span?当然,在调用函数时可以创建一个固定范围的新跨度:
f(std::span<int, 5>(&v[42], 5));
Run Code Online (Sandbox Code Playgroud)
但是,我认为“subspan”变体的可读性要好得多,它以更好的方式表达了意图,并且允许在调试版本中进行适当的范围检查。