1. sizeof возвращает размер объекта, которым в данном случае является указатель, и у вас случайно совпало с длиной строки.
2. массив таким образом в C++ создавать нельзя. Как уже написали выше.
PS: можно конечно поизвращаться и написать константное вычисление строки на этапе компиляции.
Например наподобии
template <int L>
constexpr size_t cstrlen(const char (&s)[L])
{
return L ? L - 1 : 0;
}
Или:
constexpr size_t cstrlen(const char* s)
{
return *s ? 1 + cstrlen(s + 1) : 0;
}
Но в каких компиляторах такое может как-то не так выстрелить никто не скажет