GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
std::to_array(3) C++ Standard Libary std::to_array(3)

std::to_array - std::to_array


Defined in header <array>
template<class T, std::size_t N> (1) (since C++20)
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N]);
template<class T, std::size_t N> (2) (since C++20)
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&a)[N]);


Creates a std::array from the one dimensional built-in array a. The elements of the
std::array are copy-initialized from the corresponding element of a. Copying or
moving multidimensional built-in array is not supported.


1) For every i in 0, ..., N - 1, copy-initializes result's correspond element with
a[i]. This overload is ill-formed when std::is_constructible_v<T, T&> is false.
2) For every i in 0, ..., N - 1, move-initializes result's correspond element with
std::move(a[i]). This overload is ill-formed when std::is_move_constructible_v<T> is
false.


Both overloads are ill-formed when std::is_array_v<T> is true.


a - the built-in array to be converted the std::array


-
T must meet the requirements of CopyConstructible in order to use overload (1).
-
T must meet the requirements of MoveConstructible in order to use overload (2).


1) std::array<std::remove_cv_t<T>, N>{ a[0], ..., a[N - 1] }
2) std::array<std::remove_cv_t<T>, N>{ std::move(a[0]), ..., std::move(a[N - 1]) }


There are some occasions where class template argument deduction of std::array
cannot be used while to_array being available:


* to_array can be used when the element type of the std::array is manually
specified and the length is deduced, which is preferable when implicit
conversion is wanted.
* to_array can copy a string literal, while class template argument deduction
constructs a std::array of a single pointer to its first character.


std::to_array<long>({3, 4}); // OK: implicit conversion
// std::array<long>{3, 4}; // error: too few template arguments
std::to_array("foo"); // creates std::array<char, 4>{ 'f', 'o', 'o', '\0' }
std::array{"foo"}; // creates std::array<const char*, 1>{ +"foo" }


Feature-test macro: __cpp_lib_to_array


namespace detail {


template <class T, std::size_t N, std::size_t... I>
constexpr std::array<std::remove_cv_t<T>, N>
to_array_impl(T (&a)[N], std::index_sequence<I...>)
{
return { {a[I]...} };
}


}


template <class T, std::size_t N>
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&a)[N])
{
return detail::to_array_impl(a, std::make_index_sequence<N>{});
}


namespace detail {


template <class T, std::size_t N, std::size_t... I>
constexpr std::array<std::remove_cv_t<T>, N>
to_array_impl(T (&&a)[N], std::index_sequence<I...>)
{
return { {std::move(a[I])...} };
}


}


template <class T, std::size_t N>
constexpr std::array<std::remove_cv_t<T>, N> to_array(T (&&a)[N])
{
return detail::to_array_impl(std::move(a), std::make_index_sequence<N>{});
}

// Run this code


#include <type_traits>
#include <utility>
#include <array>
#include <memory>


int main()
{
// copies a string literal
auto a1 = std::to_array("foo");
static_assert(a1.size() == 4);


// deduces both element type and length
auto a2 = std::to_array({ 0, 2, 1, 3 });
static_assert(std::is_same_v<decltype(a2), std::array<int, 4>>);


// deduces length with element type specified
// implicit conversion happens
auto a3 = std::to_array<long>({ 0, 1, 3 });
static_assert(std::is_same_v<decltype(a3), std::array<long, 3>>);


auto a4 = std::to_array<std::pair<int, float>>(
{ { 3, .0f }, { 4, .1f }, { 4, .1e23f } });
static_assert(a4.size() == 3);


// creates a non-copyable std::array
auto a5 = std::to_array({ std::make_unique<int>(3) });
static_assert(a5.size() == 1);


// error: copying multidimensional arrays is not supported
// char s[2][6] = { "nice", "thing" };
// auto a6 = std::to_array(s);
}


make_array Creates a std::array object whose size and optionally
(library fundamentals TS v2) element type are deduced from the arguments
(function template)

2022.07.31 http://cppreference.com

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.