[span.overview] # 23 Containers library [[containers]](./#containers) ## 23.7 Views [[views]](views#span.overview) ### 23.7.2 Contiguous access [[views.contiguous]](views.contiguous#span.overview) #### 23.7.2.2 Class template span [[views.span]](views.span#span.overview) #### 23.7.2.2.1 Overview [span.overview] [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L20218) A span is a view over a contiguous sequence of objects, the storage of which is owned by some other object[.](#1.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L20223) All member functions of span have constant time complexity[.](#2.sentence-1) [🔗](#lib:span_) namespace std {templateclass span {public:// constants and typesusing element_type = ElementType; using value_type = remove_cv_t; using size_type = size_t; using difference_type = ptrdiff_t; using pointer = element_type*; using const_pointer = const element_type*; using reference = element_type&; using const_reference = const element_type&; using iterator = *implementation-defined*; // see [[span.iterators]](span.iterators "23.7.2.2.7 Iterator support")using const_iterator = std::const_iterator; using reverse_iterator = std::reverse_iterator; using const_reverse_iterator = std::const_iterator; static constexpr size_type extent = Extent; // [[span.cons]](span.cons "23.7.2.2.2 Constructors, copy, and assignment"), constructors, copy, and assignmentconstexpr span() noexcept; templateconstexpr explicit(extent != dynamic_extent) span(It first, size_type count); templateconstexpr explicit(extent != dynamic_extent) span(It first, End last); templateconstexpr span(type_identity_t (&arr)[N]) noexcept; templateconstexpr span(array& arr) noexcept; templateconstexpr span(const array& arr) noexcept; templateconstexpr explicit(extent != dynamic_extent) span(R&& r); constexpr explicit(extent != dynamic_extent) span(std::initializer_list il); constexpr span(const span& other) noexcept = default; templateconstexpr explicit(*see below*) span(const span& s) noexcept; constexpr span& operator=(const span& other) noexcept = default; // [[span.sub]](span.sub "23.7.2.2.4 Subviews"), subviewstemplateconstexpr span first() const; templateconstexpr span last() const; templateconstexpr span subspan() const; constexpr span first(size_type count) const; constexpr span last(size_type count) const; constexpr span subspan( size_type offset, size_type count = dynamic_extent) const; // [[span.obs]](span.obs "23.7.2.2.5 Observers"), observersconstexpr size_type size() const noexcept; constexpr size_type size_bytes() const noexcept; constexpr bool empty() const noexcept; // [[span.elem]](span.elem "23.7.2.2.6 Element access"), element accessconstexpr reference operator[](size_type idx) const; constexpr reference at(size_type idx) const; // freestanding-deletedconstexpr reference front() const; constexpr reference back() const; constexpr pointer data() const noexcept; // [[span.iterators]](span.iterators "23.7.2.2.7 Iterator support"), iterator supportconstexpr iterator begin() const noexcept; constexpr iterator end() const noexcept; constexpr const_iterator cbegin() const noexcept { return begin(); }constexpr const_iterator cend() const noexcept { return end(); }constexpr reverse_iterator rbegin() const noexcept; constexpr reverse_iterator rend() const noexcept; constexpr const_reverse_iterator crbegin() const noexcept { return rbegin(); }constexpr const_reverse_iterator crend() const noexcept { return rend(); }private: pointer *data_*; // *exposition only* size_type *size_*; // *exposition only*}; template span(It, EndOrSize) -> span>, [*maybe-static-ext*](span.syn#concept:maybe-static-ext "23.7.2.1 Header synopsis [span.syn]")>; template span(T (&)[N]) -> span; template span(array&) -> span; template span(const array&) -> span; template span(R&&) -> span>>;} [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L20322) span is a trivially copyable type ([[basic.types.general]](basic.types.general#term.trivially.copyable.type "6.9.1 General"))[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L20326) ElementType is required to be a complete object type that is not an abstract class type[.](#4.sentence-1) [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L20330) For a span s, any operation that invalidates a pointer in the range [s.data(), s.data() + s.size()) invalidates pointers, iterators, and references to elements of s[.](#5.sentence-1)