From cppreference.com
template<classT,unsignedN=0>structextent;(since C++11)If T is an array type, provides the member constant value equal to the number of elements along the Nth dimension of the array, if N is in [0, std::rank<T>::value). For any other type, or if T is an array of unknown bound along its first dimension and N is 0, value is 0.
If the program adds specializations for std::extent or std::extent_v(since C++17), the behavior is undefined.
Helper variable template
template<classT,unsignedN=0>constexprstd::size_textent_v=extent<T,N>::value;(since C++17)Inherited from
Member constants
value
[static]
the number of elements along the Nth dimension of T
(public static member constant)Member functions
operator std::size_t
converts the object to std::size_t, returns value
(public member function)operator()
(C++14)
returns value
(public member function)Member types
Type Definition value_typestd::size_ttypestd::integral_constant<std::size_t,value>Possible implementation
template<classT,unsignedN=0>structextent:std::integral_constant<std::size_t,0>{};template<classT>structextent<T[],0>:std::integral_constant<std::size_t,0>{};template<classT,unsignedN>structextent<T[],N>:std::extent<T,N-1>{};template<classT,std::size_tI>structextent<T[I],0>:std::integral_constant<std::size_t,I>{};template<classT,std::size_tI,unsignedN>structextent<T[I],N>:std::extent<T,N-1>{};Example
Run this code
#include<type_traits>static_assert(std::extent_v<int[3]>==3&&// default dimension is 0std::extent_v<int[3],0>==3&&// the same as abovestd::extent_v<int[3][4],0>==3&&std::extent_v<int[3][4],1>==4&&std::extent_v<int[3][4],2>==0&&std::extent_v<int[]>==0);intmain(){constautoext=std::extent<int['*']>{};static_assert(ext==42);// with implicit conversion to std::size_tconstintints[]{1,2,3,4};static_assert(std::extent_v<decltype(ints)>==4);// array size[[maybe_unused]]intary[][3]={{1,2,3}};// ary[0] is of type reference to 'int[3]', so, the extent// cannot be calculated correctly and it returns 0static_assert(std::is_same_v<decltype(ary[0]),int(&)[3]>);static_assert(std::extent_v<decltype(ary[0])>==0);// removing reference gives correct extent value 3static_assert(std::extent_v<std::remove_cvref_t<decltype(ary[0])>>==3);}See also
(C++11)
checks if a type is an array type
(class template)
(C++11)
obtains the number of dimensions of an array type
(class template)
(C++11)
removes one extent from the given array type
(class template)
(C++11)
removes all extents from the given array type
(class template)
(C++23)
a descriptor of a multidimensional index space of some rank
(class template)
(C++26)
obtains the size of reflected array type along a specified dimension
(function)