As far as I know, the type of N in T[N] is std::size_t. I'm using C++17, in case it matters.
template<class T, T N>
void check(char const (&)[N])
{ std::cout << std::is_same_v<std::size_t, T> << '\n'; }
int main()
{
char c[5];
check(c);
return 0;
}
This prints 1. However, this fails to compile:
template<std::size_t N>
void check(char const (&)[N]) { std::cout << "std::size_t"; }
template<int N>
void check(char const (&)[N]) { std::cout << "int"; }
int main()
{
char c[5];
check(c);
return 0;
}
<source>: In function 'int main()':
<source>:17:12: error: call of overloaded 'check(char [5])' is ambiguous
check(c);
^
<source>:9:6: note: candidate: 'void check(const char (&)[N]) [with long unsigned int N = 5]'
void check(char const (&)[N]) { std::cout << "std::size_t"; }
^~~~~
<source>:12:6: note: candidate: 'void check(const char (&)[N]) [with int N = 5]'
void check(char const (&)[N]) { std::cout << "int"; }
^~~~~
If N is std::size_t, isn't the first template overload the best match? I don't understand where the ambiguity is coming from.