[mdspan.extents.cons] # 23 Containers library [[containers]](./#containers) ## 23.7 Views [[views]](views#mdspan.extents.cons) ### 23.7.3 Multidimensional access [[views.multidim]](views.multidim#mdspan.extents.cons) #### 23.7.3.3 Class template extents [[mdspan.extents]](mdspan.extents#cons) #### 23.7.3.3.3 Constructors [mdspan.extents.cons] [🔗](#lib:extents,constructor) `template constexpr explicit(see below) extents(const extents& other) noexcept; ` [1](#1) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21276) *Constraints*: - [(1.1)](#1.1) sizeof...(OtherExtents) == rank() is true[.](#1.1.sentence-1) - [(1.2)](#1.2) ((OtherExtents == dynamic_extent || Extents == dynamic_extent || OtherExtents == Extents) && ...) is true[.](#1.2.sentence-1) [2](#2) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21285) *Preconditions*: - [(2.1)](#2.1) other.extent(r) equals Er for each r for which Er is a static extent, and - [(2.2)](#2.2) either * [(2.2.1)](#2.2.1) sizeof...(OtherExtents) is zero, or * [(2.2.2)](#2.2.2) other.extent(r) is representable as a value of type index_type for every rank index r of other[.](#2.sentence-1) [3](#3) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21302) *Postconditions*: *this == other is true[.](#3.sentence-1) [4](#4) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21306) *Remarks*: The expression inside explicit is equivalent to:(((Extents != dynamic_extent) && (OtherExtents == dynamic_extent)) || ... ) ||(numeric_limits::max() < numeric_limits::max()) [🔗](#lib:extents,constructor_) `template constexpr explicit extents(OtherIndexTypes... exts) noexcept; ` [5](#5) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21322) Let N be sizeof...(OtherIndexTypes), and let exts_arr bearray{static_cast< index_type>(std​::​move(exts))...}[.](#5.sentence-1) [6](#6) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21327) *Constraints*: - [(6.1)](#6.1) (is_convertible_v && ...) is true, - [(6.2)](#6.2) (is_nothrow_constructible_v && ...) is true, and - [(6.3)](#6.3) N == rank_dynamic() || N == rank() is true[.](#6.sentence-1) [*Note [1](#note-1)*: One can construct extents from just dynamic extents, which are all the values getting stored, or from all the extents with a precondition[.](#6.3.sentence-2) — *end note*] [7](#7) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21343) *Preconditions*: - [(7.1)](#7.1) If N != rank_dynamic() is true,exts_arr[r] equals Er for each r for which Er is a static extent, and - [(7.2)](#7.2) either * [(7.2.1)](#7.2.1) sizeof...(exts) == 0 is true, or * [(7.2.2)](#7.2.2) each element of exts is representable as a nonnegative value of type index_type[.](#7.sentence-1) [8](#8) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21361) *Postconditions*: *this == extents(exts_arr) is true[.](#8.sentence-1) [🔗](#lib:extents,constructor__) `template constexpr explicit(N != rank_dynamic()) extents(span exts) noexcept; template constexpr explicit(N != rank_dynamic()) extents(const array& exts) noexcept; ` [9](#9) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21377) *Constraints*: - [(9.1)](#9.1) is_convertible_v is true, - [(9.2)](#9.2) is_nothrow_constructible_v is true, and - [(9.3)](#9.3) N == rank_dynamic() || N == rank() is true[.](#9.sentence-1) [10](#10) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21388) *Preconditions*: - [(10.1)](#10.1) If N != rank_dynamic() is true,exts[r] equals Er for each r for which Er is a static extent, and - [(10.2)](#10.2) either * [(10.2.1)](#10.2.1) N is zero, or * [(10.2.2)](#10.2.2) exts[r] is representable as a nonnegative value of type index_type for every rank index r[.](#10.sentence-1) [11](#11) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21405) *Effects*: - [(11.1)](#11.1) If N equals rank_dynamic(), for all d in the range [0, rank_dynamic()), direct-non-list-initializes *dynamic-extents*[d] with as_const(exts[d])[.](#11.1.sentence-1) - [(11.2)](#11.2) Otherwise, for all d in the range [0, rank_dynamic()), direct-non-list-initializes *dynamic-extents*[d] with as_const(exts[*dynamic-index-inv*(d)])[.](#11.2.sentence-1) [🔗](#lib:extents,constructor___) `template explicit extents(Integrals...) -> see below; ` [12](#12) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21427) *Constraints*: (is_convertible_v && ...) is true[.](#12.sentence-1) [13](#13) [#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/containers.tex#L21431) *Remarks*: The deduced type is extents synopsis [span.syn]")...>[.](#13.sentence-1)