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的值,它需要执行该副本,因此调用是递归的."
我真的没有得到它!有人可以解释一下这个!
非常感谢!:)
主要问题在于:
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)),因此,你会得到由递归构造函数调用引起的堆栈溢出.
| 归档时间: |
|
| 查看次数: |
61 次 |
| 最近记录: |