Alternatively we could change the core language so that when default template argument is T[], then template parameter is deduced as array of known size:
#include <cstddef>
#include <type_traits>
constexpr struct from_range_t{} from_range;
template <typename T>
struct vector
{
template <typename Range = T[]>
vector(from_range_t, Range&& r)
{
// Range is int[] today
static_assert(std::is_same_v<Range, int[3]>);
}
};
template <typename T, std::size_t N>
vector(const T (&)[N]) -> vector<T>;
int main()
{
// today
using Arr = int[];
vector<int> v1 = {from_range, Arr{1, 2u, 3}};
// proposed
vector<int> v2 = {from_range, {1, 2u, 3}};
}