为什么模板名称在派生类中可用(基类是模板的实例)?

hhg*_*gdd 7 c++ templates using

我遇到了以下代码(用基本类型简化):

template <typename T>
class Base {
  T t;
};

class Derived : public Base<short> {
 public:
  using Base<short>::Base;
};

int main() {
  Derived::Base<long long> x;
  printf("%lu\n", sizeof(x));
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它可以编译工作(输出为8,这是long long的大小)。看起来我可以使用Base<T>任何类型的T数据Derived::Base,即使Derived只是Base<short>。(在我遇到的代码中,Base它本身不可见main。)

但是,我不太了解这种语法及其工作原理。

Derived::Base模板名称,类还是函数(ctor)?似乎是模板名称。模板名称在实例化此模板的所有类中都可用(例如,所有类型的模板名称Base都在其中)?我很混乱。任何对cppreference或C ++标准的解释或指针均应赞赏。Base<T>T

Jar*_*d42 3

来自en.cppreference.com/injected-class-name

在以下情况下,注入的类名称被视为类模板本身的模板名称:

  • 其后是 <
  • [..]

因此,根据上下文,Base里面是一个类或模板名称。Base<T>