#include <array>
#include <cstddef>
#include <type_traits>
#include <utility>
template <class T, std::size_t... Is, class... Rest>
constexpr auto make_md_array_impl(const T& val, std::index_sequence<Is...>, Rest... rs) {
if constexpr (sizeof...(Rest) != 0) {
// recurse sizeof...(Is) times to create inner arrays
return std::array{((void)Is, make_md_array_impl(val, rs...))...};
} else {
// inner most array, initialize it with sizeof...(Is) val's:
return std::array{((void)Is, val)...};
}
}
template <std::size_t... Ns, class T>
constexpr auto make_md_array(const T& val) {
return make_md_array_impl(val, std::make_index_sequence<Ns>{}...);
}
int main() {
const std::array<std::array<std::array<double, 1000>, 3>, 4> ref{};
constexpr auto arr = make_md_array<4, 3, 1000>(-1.); // double[4][3][1000]
static_assert(std::is_same_v<decltype(ref), decltype(arr)>);
}
https://cppinsights.io/s/b6a35a2d
In this example, the
return std::array{...};lines becomereturn std::std::array{...};. It could be due to an implementation detail, but I'd expect that to bestd::__std::arrayor similar in that case - and the result is the same for bothlibstdc++andlibc++.