Clang and GCC disagree on accepting code using non type template parameter

Viewed 52

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?

0 Answers
Related