【发布时间】:2018-04-07 15:34:57
【问题描述】:
我遇到了很多关于 CRTP 是什么的解释,但没有解释它为什么起作用。
微软在 ATL 中的 CRTP 实现也是在 1995 年由 Jan Falkin 独立发现的,他不小心从派生类派生了一个基类。 Christian Beaumont 第一次看到 Jan 的代码,最初认为它不可能在当时可用的 Microsoft 编译器中编译。在发现它确实有效之后,Christian 将整个 ATL 和 WTL 设计都基于这个错误。
例如,
template< typename T >
class Base
{
...
};
class Derived : public Base< Derived >
{
...
};
我明白为什么以及何时可以使用它。但我想知道编译器是如何以这种方式工作的。因为在我看来,由于无休止的递归,它不应该工作:类Derived继承自Base< Derived >,其中Derived是继承自Base< Derived >的类,其中Derived...等等。
能否请您从编译器的角度逐步解释它是如何工作的?
【问题讨论】: