我正在使用可变参数模板,并决定实现我自己的元组类。但是当我尝试实现构造函数时,我发现隐式创建的构造函数似乎涵盖了我即将构建的内容。考虑以下代码。
template<typename ... Tail> struct mytuple { };
template<typename Head, typename ... Tail>
struct mytuple<Head, Tail...>
{
Head head;
mytuple<Tail...> tail;
};
int main()
{
mytuple<int, int, int> t1{1,2,3}; // <--
mytuple<int, int, int> t2{1,{2,{3,{}}}};
}
t1{1,2,3}
已经有效?t2{1,{2,{3,{}}}}
也起作用,而不仅仅是一种而不是另一种?我的猜测是,这个“魔法”是由一些隐式定义的初始化列表构造函数完成的(因为C ++ 11我不确定在哪些条件下定义了哪些构造函数)。在第二个元组t2{1,{2,{3,{}}}}
的情况下,我有点理解为什么这是有效的,因为大括号的结构反映了构造类的结构。但令我惊讶的是,这两种变体似乎都有效。