A non-owning lightweight wrapper object referring to a contiguous sequence of elements in memory
Questions tagged [std-span]
60 questions
411
votes
4 answers
What is a "span" and when should I use one?
Recently I've gotten suggestions to use span's in my code, or have seen some answers here on the site which use span's - supposedly some kind of container. But - I can't find anything like that in the C++17 standard library.
So what is this…

einpoklum
- 118,144
- 57
- 340
- 684
21
votes
1 answer
Why does std::span lack the comparison operators?
Wasn't the std::span designed as a lightweight reference to sub-regions of std::vector/std::array/plain array and alike? Shouldn't it also contain comparison operators in its API, to be consistent with them? What was the reasoning behind the…

GreenScape
- 7,191
- 2
- 34
- 64
19
votes
2 answers
Does span propagate const?
The standard containers propagate const. That is, their elements are automatically const if the containers themselves are const. For example:
const std::vector vec{3, 1, 4, 1, 5, 9, 2, 6};
ranges::fill(vec, 314); // impossible
const std::list…

L. F.
- 19,445
- 8
- 48
- 82
16
votes
1 answer
Does C++ allow comparison between std::span::iterators when one span is a subspan of the other?
Generally speaking C++ doesn't allow comparing iterators between different containers. For example:
int main() {
std::vector v = {1, 2, 3};
std::vector w = {4, 5, 6};
std::cout << v.end() == w.end() << std::endl; //…

Maks Verver
- 661
- 4
- 14
16
votes
1 answer
Why are span's array and std::array constructors different from its container constructors
I have been playing around with the latest specification for std::span using the clang trunk and libc++ on Godbolt and find some of the constructors confusing.
In particular I find the constructors from a plain old array and and a std::array to be…

John M
- 163
- 5
14
votes
1 answer
Why does std::span lack cbegin and cend methods?
Why does std::span only have begin and end methods and not their constant iterator counterparts cbegin and cend? (standard)
What I noticed too is that the proposals for span that I could find do have a definition for cbegin and cend: P0122R7. Why…

SWdV
- 1,715
- 1
- 15
- 36
12
votes
3 answers
Why in particular should I rather pass a std::span than a std::vector& to a function?
I know this might overlap with the question What is a “span” and when should I use one?, but I think the answer to this specific part of the question is pretty confusing. On one hand, there are quotes like this:
Don't use it if you have a standard…

Tom Gebel
- 744
- 1
- 4
- 13
11
votes
1 answer
Return conditional `range_expression`
What's the most efficient way of iterating over one of several known ranges based on some condition?
pseudo-code for a binary condition:
for element in (condition ? range_a : range_b)
// do work
This 'example' shows my intention using a…

Tom
- 3,281
- 26
- 33
10
votes
2 answers
Simplest way to assign std::span to std::vector
I wanted to do this
#include
#include
struct S
{
std::vector v;
void set(std::span _v)
{
v = _v;
}
};
But it does not compile. What are the alternatives?

tuket
- 3,232
- 1
- 26
- 41
10
votes
1 answer
What happened to std::cspan?
std::span has been voted into C++20. I assumed that along with std::span, there would be a convenience alias defined like this:
template
using cspan = span;
To me, this seems like a really…

Indiana Kernick
- 5,041
- 2
- 20
- 50
10
votes
1 answer
Why is std::span a pointer + size and not two iterators
It appears that std::span in C++20 is defined similarly to
template
class span
{
T* begin;
size_t count;
};
And not
template
class span
{
Iter begin;
Iter end;
};
which is more general…

user877329
- 6,717
- 8
- 46
- 88
9
votes
2 answers
Why does std::span lack size_type?
I've been updating old code that used my homebrew span class to the one that is more in line with C++20 std::span and I'm getting compile errors because std::span doesn't have size_type and instead has index_type. There's been a huge drama over…
user3624760
8
votes
1 answer
why can't I construct an std::span from iterators?
Consider a large memory container. In this simple example an std::vector:
std::vector v = { 0, 1, 2, 3, 4, 5 };
std::span allows me create a lightweight view over the memory. Now I want to simply print the span:
template
void…

Stack Danny
- 7,754
- 2
- 26
- 55
7
votes
1 answer
Create span of string_views from C string array
Given some function void func(std::span), how does one feed this function a raw array of C-strings const char** in the most efficient manner?
As far as I understood this should be possible as without any copying as std::string_view…

Joel Bodenmann
- 2,152
- 2
- 17
- 44
6
votes
2 answers
How do you do bounds checking with std span?
std::vector and pretty much all other containers have a very convenient way of bounds checking: at(). std::span doesn't have that apparently.
Why?
Is there a replacement? Other than rolling out your own at()?

Aykhan Hagverdili
- 28,141
- 6
- 41
- 93