The problem with any sort of constexpr string or array type is its literal value syntax.
For arrays the appropariate literal syntax is hijacked by the initializer list. And the case with string literal is even worse.
The skewed copying semantic of arrays is another obstacle against defining any none default-constructible constexpr array/string type.
Touching old C style array semantics is imposible, so the only remaining solution is to define new builtin array with proper syntax.
About the initializer_list: the only reason for its existance is the semantics of relic C style a array that does not allow using curly-brace-enclosed values as arrays.
So the only option to be able to be able to use curly-brace-enclosed values would be some magic type named initializer_list which lacked a formal implementation, hence could not be constexpr.The outcome was being unable to constexpr-initialize any array type to none-default values.
constexpr int arr[5] = {1, 2, 3, 4, 5};
constexpr std::array<int, 5> arr = {1, 2, 3, 4, 5};
constexpr std::initializer_list<int> arr = {1, 2, 3, 4, 5};
Its time for the statically sized C++ style array to claim its initialization format and take it back from the initializer_list.
Currently it is assumed that C array is constructed from initializer_list.
int arr[5] = {1, 2, 3, 4, 5};
auto il = {1, 2, 3, 4, 5};
int arr[5] = il; //Cannot construct a C-style array from an `initializer_list`
The proposition is to consider that C array and initializer_list are both constructed from C++ array.
Bottom line is constexpr array literal needs syntax and semantic spec and I am keen to see a proper one.
Your examples are showing the problem: why can you not use the array or initializer_list in as a template parameter?
Second question: what is the true type of CBLV (curly-braced-list of values) that initializes both C array and initializer_list?
Third question: why is initializer_list prefered over C array in capturing the CBLV?
Well because C array is relic; nobody dare touching its complex semantics - trying to avoid breaking things. C array was a result of premature optimization. Because copying arrays was believed to be expensive and prone to stack overflow, it was defined as -so called- reference type.
Forth question: why is initializer_list declared as a library class and not a built-in type?
In any other sane language that I have ever seen, equivalent of CBLV has the array type. That includes C dialects(C#, java ...).Bottom line is constexpr array literal needs syntax and semantic spec and I am keen to see a proper one.