fork download
  1. #include <iostream>
  2. #include <initializer_list>
  3. #include <array>
  4.  
  5. constexpr size_t size_to_size(size_t v) { return v; } // 1 - OK
  6.  
  7. template<typename T>
  8. constexpr size_t il_to_size(std::initializer_list<T> il) { return il.size(); } // 2 - OK
  9.  
  10. // 3 - error
  11. template<typename T>
  12. constexpr auto il_to_array(std::initializer_list<T> il) { return std::array<T, il.size()>(); }
  13.  
  14. template<size_t N>
  15. void print_constexpr() { std::cout << N << std::endl; }
  16.  
  17. int main() {
  18.  
  19. constexpr std::initializer_list<int> il = { 1, 2, 3 };
  20. print_constexpr<il.size()>(); // 0 - OK
  21.  
  22. print_constexpr< size_to_size(il.size()) >(); // 1 - OK
  23.  
  24. print_constexpr< il_to_size(il) >(); // 2 - OK
  25.  
  26. auto ar1 = std::array<int, il.size()>(); // OK - body of function: il_to_array()
  27.  
  28. //auto ar2 = il_to_array(il); // 3 - error
  29.  
  30. return 0;
  31. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
3
3
3