给定:
template <typename T>
class C {
C & operator ++ () { ... }
};
为什么/如何允许
C
声明类型为C
的变量和函数,而不需要命名为C<T>
?在处理具有许多参数的模板时,我没有真正考虑过这个问题,因为拼写“自身类型”会很麻烦。你需要知道这方面的任何特殊情况吗?
[n3290: 14.6.1/1]:
类模板与普通(非模板)类一样,有一个注入类名(第9条款)。该注入类名可以用作模板名称或类型名称。当它在模板参数列表中使用时,作为模板模板参数的模板参数,或者作为友好类模板声明的限定类型说明符中的最终标识符时,它引用了类模板本身。否则,它等价于跟随在封闭在<>中的类模板的模板参数之后的模板名称。
看起来,它仅仅是一个方便的特性。
C语言为什么/如何允许声明类型为C的变量和函数,而不需要命名为C?
这只是按照规范进行的。模板的名称被注入到其主体中,并表示实际类型(带有参数)。
我需要知道这方面的任何特殊情况吗?
没有什么严重的问题。你只需要记住,这不适用于基类,所以要使用CRTP,你必须这样做:
template <class T>
class A : public Base<A<T> > // not Base<A>
这只是一种语法糖。
如果你需要更改模板参数,不必改变方法签名非常方便。
injected-class-name
”。这个测试用例并不能完全证明,因为我不相信实现已经“完全”遵循了C++11语言规则,但我认为它肯定足够好了。 - Lightness Races in Orbit