元编程中的堆栈溢出

MEM*_*EMS 1 stack-overflow inheritance copy-constructor template-meta-programming c++11

我正在读"经典C++中的Advance Metaprogramming"一书!在第16页上,作者提供了一个例子:

struct base
{
    base() {}
    template <typename T>
    base(T x) {}
};
struct derived : base
{
    derived() {}
    derived(const derived& that)
        : base(that) {}
};
void main()
{
    derived d1;
    derived d2 = d1; //stack overflow!! why?! 
}
Run Code Online (Sandbox Code Playgroud)

作者说:"赋值d2 = d1导致堆栈溢出.隐式复制构造函数必须调用基类的复制构造函数,因此通过上面的12.8(C++标准)它永远不能调用通用构造函数.编译器生成了派生的拷贝构造函数,它会调用基本拷贝构造函数(它是隐式的).不幸的是,给出了派生的拷贝构造函数,它包含一个显式函数调用,即base(that).因此,遵循通常的重载解析规则,它匹配通用构造函数与T = derived.由于此函数采用x的值,它需要执行该副本,因此调用是递归的."

我真的没有得到它!有人可以解释一下这个!

非常感谢!:)

Tar*_*don 6

主要问题在于:

base(T x) {}
Run Code Online (Sandbox Code Playgroud)

base的构造函数将x(表示d1)作为值,这会导致x被临时复制.复制x将导致再次调用派生的原始复制构造函数,即这一个:

derived(const derived& that)
    : base(that) {}
Run Code Online (Sandbox Code Playgroud)

这个构造函数本身将再次调用第一个(base(T x)),因此,你会得到由递归构造函数调用引起的堆栈溢出.