了解支架初始化

时间:2014-10-16 09:21:16

标签: c++ c++11 constructor initializer-list

我正在使用可变参数模板,并决定实现我自己的元组类。但是当我尝试实现构造函数时,我发现隐式创建的构造函数似乎涵盖了我即将构建的内容。考虑以下代码。

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,{}}}}的情况下,我有点理解为什么这是有效的,因为大括号的结构反映了构造类的结构。但令我惊讶的是,这两种变体似乎都有效。

0 个答案:

没有答案