#include <cassert>
#include <cstddef>
#include <iostream>

constexpr int select(long) { return 1; }
template<class T> constexpr int select(T) { return 2; }
constexpr int tied(int) { return 3; }
template<class T> constexpr int tied(T) { return 4; }
template<class T, std::size_t N>
constexpr std::size_t extent(T (&)[N]) { return N; }

int main() {
    static_assert(select(1) == 2);
    static_assert(select(1L) == 1);
    static_assert(tied(1) == 3);
    const int a[] = {1, 2, 3};
    static_assert(extent(a) == 3);
    assert(extent(a) == 3);
    std::cout << "overload ok\n";
}
