#include <iostream>
#include <initializer_list>
#include <array>

constexpr size_t size_to_size(size_t v) { return v; }	// 1 - OK

template<typename T>
constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); }	// 2 - OK

// 3 - error
template<typename T>
constexpr auto il_to_array(std::initializer_list<T> il) { return std::array<T, il.size()>(); }

template<size_t N>
void print_constexpr() { std::cout << N << std::endl; }
 
int main() {

	constexpr std::initializer_list<int> il = { 1, 2, 3 };
	print_constexpr<il.size()>();	// 0 - OK
	
	print_constexpr< size_to_size(il.size()) >();	// 1 - OK
	
	print_constexpr< il_to_size(il) >();	// 2 - OK

	auto ar1 = std::array<int, il.size()>();	// OK - body of function: il_to_array()
	
 	//auto ar2 = il_to_array(il);	// 3 - error
 
	return 0;
}