c – 奇怪的重复模板模式实现是否具体?
作者:互联网
所以我读完了这个:https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern
并了解奇怪的重复模板模式(CRTP)如何工作.但它似乎取决于编译器实现,特别是编译器:
>定义每个模板类所需的空间
>然后编译子类的方法
>然后编译父类的方法
虽然我可以看到这个命令如何允许编译,但我觉得这是一个利用编译器结构而不是标准所要求的编译器通过顺序.但我觉得一组同样合法的编译器传递将是:
>定义父类所需的空间
>编译父类方法
>定义子类所需的空间
>编译子类方法
如果编译器使用这些传递,则在尝试评估子类型时,CRTP将在步骤2中失败.
所以我刚刚编写了这些编译器传递,但是有一个标准的要求会对编译器施加约束,它会严格遵循第一次传递的3次传递吗?或者CRTP是否存在于了解目前如何实现编译器的灰色区域?
正如我所看到的那样,标准需要第一遍确定对象大小,然后是第二遍编译方法.但是第二遍wold必须愿意在父对象之前构建子对象方法,这似乎是向后的.
解决方法:
CRTP从未被实施定义或有条件支持,IIRC在发明时令人惊喜并且从那时起就被接受.
从[class]起
A class-name is inserted into the scope in which it is declared immediately after the class-name is seen. The class-name is also inserted into the scope of the class itself; this is known as the injected-class-name.
其中class-name是要声明的类的名称.因此,类名在base-clause之前已经可见,它是base的列表,但是只有在完全定义之后类才完成.
但是,从[temp]开始,模板允许使用不完整类型作为其类型参数
A template type argument may be an incomplete type.
请注意,即使其类型参数不是,模板也是完整的.
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
实例化模板可以完成的原因是因为模板类型参数本身在模板中可能是不完整的,从而避免了循环逻辑
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>
{
};
我们得出结论,这种模式是有效的.编译器如何编译它是无关紧要的,如果它符合标准,它将编译该代码.
标签:crtp,c,language-lawyer,metaprogramming 来源: https://codeday.me/bug/20190727/1550653.html