#include <initializer_list>
#include <utility>
void foo(std::initializer_list<std::pair<int,int>>) {}
template <class T> void bar(T) {}
int main() {
foo({{0,1}}); //This works
foo({{0,1},{1,2}}); //This works
bar({{0,1}}); //This warns
bar({{0,1},{1,2}}); //This fails
bar(std::initializer_list<std::pair<int,int>>({{0,1},{1,2}})); //This works
}
Run Code Online (Sandbox Code Playgroud)
这不能在gcc 4.5.3中编译,它会对标记的行说明deducing ‘T’ as ‘std::initializer_list<std::initializer_list<int> >’并标记行的错误说明no matching function for call to ‘bar(<brace-enclosed initializer list>)’.为什么gcc可以推断出第一次调用bar的类型而不是第二次调用的类型,除了漫长而丑陋的演员之外,有没有办法解决这个问题呢?
下面的长显式初始化列表是否可以被生成它的某个模板替换?
std::array<Foo, n_foos> foos = {{
{0, bar},
{1, bar},
{2, bar},
{3, bar},
{4, bar},
{5, bar},
{6, bar},
{7, bar},
}};
Run Code Online (Sandbox Code Playgroud)
现在这里的代码只是因为我们有了constexpr int n_foos = 8.怎么能做到任意和大n_foos?