I have the following code(not important what it does, it is attempt to make multidimensional std::array aliases nice).
#include <array>
#include <cstdlib>
struct arg{
static constexpr int invalid = 123456789;
constexpr arg(int d0): d0{d0}, d1{invalid}, d2{invalid}{
}
constexpr arg(int d0, int d1): d0{d0}, d1{d1}, d2{invalid}{
}
constexpr arg(int d0, int d1, int d2): d0{d0}, d1{d1}, d2{d2}{
}
int d0;
int d1;
int d2;
};
template<typename T, arg dims>
using xarray =
std::conditional_t<dims.d1==arg::invalid,
std::array<T, dims.d0>,
std::conditional_t<dims.d2==arg::invalid,
std::array<std::array<T,dims.d1>, dims.d0>,
std::array<std::array<std::array<T,dims.d2>, dims.d1>, dims.d0>>>;
int main(int argc, char **argv) {
xarray<int, 2> arr1;
arr1.at(1) = rand();
xarray<int, {2,5}> arr2;
arr2.at(1).at(4) == rand();
}
gcc compiles the code, clang rejects it with:
error: expected expression xarray<int, {2,5}> arr2;
So my question is: is this code legal C++20/23?