我正在查找相关名称的参考,并且遇到了当前实例化。但是,我很难理解它的措辞。这是有问题的链接:
https://en.cppreference.com/w/cpp/language/dependent_name#Current_instantiation
它声明可以推论名称来引用当前实例,但是它实际上并未定义可以是或不能是当前实例的内容,而是仅显示示例并告诉您可以引用它的内容。
谁能解释一下什么是当前实例?
答案 0 :(得分:2)
非正式地讲,短语“当前实例化”和“当前实例化的成员”的定义是为了建立一个规则,该规则在类模板的范围内,该类及其成员的名称符合大多数语法要求像非依赖名称。在某些情况下,这使编写类模板的工作不再那么麻烦,需要更少的typename
和template
关键字,显式this->
成员访问表达式等。
该cppreference页面的确在“仅以下名称可以引用当前实例”下的四个项目符号中定义了可以和不能成为当前实例的内容。 (尽管“唯一”也许不是最好的措词。)此列表与[temp.dep.type]/1中的标准的正式定义非常相似。
请注意,即使Standard和cppreference.com都在谈论“ the 当前实例化”,但在代码内的单个点上,也可以有多个类类型可以作为当前实例化。例如,如果我们有
template <typename X>
class A {
class B {
template <typename Y>
class C {
// Point #1
void f();
};
};
};
template <typename X> template <typename Y>
void A<X>::B::C<Y>::f() {
// Point #2
}
在上面的点#1和点#2上,名称A
,B
和C
都是当前实例。 A<X>
,A<X>::B::C<Y>
,A::B
等也是如此。
只有类类型可以是当前实例,并且该类类型将始终是类模板的特化或类模板特化中的嵌套类。
请注意,用于命名当前实例的规则是根据所使用的确切语法以及模板定义的上下文而定的,而不考虑该模板的任何特定实例或所涉及类型的标识。也就是说,我们可以从上面的示例确定在某些点上,A<X>::B
命名了当前实例,而typename A<std::decay_t<X>>::B
没有命名。而且,即使我们稍后实例化A<int>
,即使A<X>::B
和typename A<std::decay_t<X>>::B
属于同一类型A<int>::B
,这也确实不会改变任何事实模板中拼写为typename A<std::decay_t<X>>::B
的人仍然是未知专业的成员,而不是当前专业的成员。