#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KI2luY2x1ZGUgPGFycmF5PgoKY29uc3RleHByIHNpemVfdCBzaXplX3RvX3NpemUoc2l6ZV90IHYpIHsgcmV0dXJuIHY7IH0JLy8gMSAtIE9LCgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgpjb25zdGV4cHIgc2l6ZV90IGlsX3RvX3NpemUoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGlsKSB7IHJldHVybiBpbC5zaXplKCk7IH0JLy8gMiAtIE9LCgovLyAzIC0gZXJyb3IKdGVtcGxhdGU8dHlwZW5hbWUgVD4KY29uc3RleHByIGF1dG8gaWxfdG9fYXJyYXkoc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGlsKSB7IHJldHVybiBzdGQ6OmFycmF5PFQsIGlsLnNpemUoKT4oKTsgfQoKdGVtcGxhdGU8c2l6ZV90IE4+CnZvaWQgcHJpbnRfY29uc3RleHByKCkgeyBzdGQ6OmNvdXQgPDwgTiA8PCBzdGQ6OmVuZGw7IH0KIAppbnQgbWFpbigpIHsKCgljb25zdGV4cHIgc3RkOjppbml0aWFsaXplcl9saXN0PGludD4gaWwgPSB7IDEsIDIsIDMgfTsKCXByaW50X2NvbnN0ZXhwcjxpbC5zaXplKCk+KCk7CS8vIDAgLSBPSwoJCglwcmludF9jb25zdGV4cHI8IHNpemVfdG9fc2l6ZShpbC5zaXplKCkpID4oKTsJLy8gMSAtIE9LCgkKCXByaW50X2NvbnN0ZXhwcjwgaWxfdG9fc2l6ZShpbCkgPigpOwkvLyAyIC0gT0sKCglhdXRvIGFyMSA9IHN0ZDo6YXJyYXk8aW50LCBpbC5zaXplKCk+KCk7CS8vIE9LIC0gYm9keSBvZiBmdW5jdGlvbjogaWxfdG9fYXJyYXkoKQoJCiAJLy9hdXRvIGFyMiA9IGlsX3RvX2FycmF5KGlsKTsJLy8gMyAtIGVycm9yCiAKCXJldHVybiAwOwp9