Jon*_*Mee 3 c++ metaprogramming crtp language-lawyer
所以我已经通读了这个:https : //en.wikipedia.org/wiki/Curiously_recurring_template_pattern
并了解 Curiously Recurring Template Pattern (CRTP) 的工作原理。但这似乎取决于编译器的实现,特别是编译器:
虽然我可以看到这个顺序如何允许编译,但我觉得它是一种利用编译器构造而不是标准要求的编译器传递顺序。但我觉得一组同样合法的编译器传递将是:
如果编译器使用这些传递,则 CRTP 在尝试评估子类型时将在第 2 步失败。
所以我刚刚弥补这些编译通过,但有一个标准的要求,关于编译器将限制其多坚持1的3个通行证ST?或者 CRTP 是否存在于了解当前编译器如何实现的灰色区域?
我看到它,以允许该标准需要要求1个第一通,其建立的对象大小,接着进行2次通过该编译的方法。但是这第二遍必须愿意在父对象之前构建子对象方法,这似乎是倒退。
CRTP 从未定义或有条件地支持实现,IIRC 在发明时这是一个惊喜,并且从那时起就被接受了。
来自[类]
一个类名被插入在其中后立即宣布的范围类的名字能够被看见。的类名也被插入到类本身的范围; 这被称为注入类名称。
其中class-name是要声明的类的名称。因此,类名在base-clause之前已经可见,它是基类列表,但类只有在其完整定义后才完整。
但是,模板可以使用不完整的类型作为其类型参数,从[temp]
模板类型参数可能是不完整的类型。
请注意,即使其类型参数不完整,模板也是完整的。
template<typename>
struct S {};
struct U // U is visible after this line
: S<U> // S<U> is a complete type
{
S<U> s; // well-formed
}; // U is complete after this line
Run Code Online (Sandbox Code Playgroud)
实例化模板之所以能够完整,是因为模板类型参数本身在模板中可能是不完整的,从而避免了循环逻辑
template<typename T>
struct A
{
T t; // ill-formed, incomplete type T in instantiation of A<B> from below
};
struct B : A<B> // implicit instantiation of the specialization A<B>
{
};
Run Code Online (Sandbox Code Playgroud)
我们得出结论该模式是有效的。编译器如何设法编译它是无关紧要的,如果它符合标准,它将编译该代码。
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |