¿La metaprogramación con estado está mal formada (todavía)?

Uno de mis inventos más queridos / malvados que he tenido la fortuna de encontrar es elcontador constexpr, también conocido como metaprogramación con estado. Como se menciona en la publicación, parece ser legal en C ++ 14, y me pregunto si algo ha cambiado con C ++ 17.

La siguiente es una implementación basada en gran medida en la publicación

template <int N>
struct flag
{
    friend constexpr int adl_flag(flag<N>);
    constexpr operator int() { return N; }
};

template <int N>
struct write
{
    friend constexpr int adl_flag(flag<N>) { return N; }
    static constexpr int value = N;
};

template <int N, int = adl_flag(flag<N>{})>
constexpr int read(int, flag<N>, int R = read(0, flag<N + 1>{}))
{
    return R;
}

template <int N>
constexpr int read(float, flag<N>)
{
    return N;
}

template <int N = 0>
constexpr int counter(int R = write<read(0, flag<0>{}) + N>::value)
{
    return R;
}

Y nosotrosúsalo como

static_assert(counter() != counter(), "Your compiler is mad at you"); 

template<int = counter()>
struct S {};

static_assert(!std::is_same_v<S<>, S<>>, "This is ridiculous");

Esto, por cierto, es una contradicción directa con¿Almacenamiento de estados en metaprogramación en C ++?

Respuestas a la pregunta(1)

Su respuesta a la pregunta