代码之家  ›  专栏  ›  技术社区  ›  Krystian S

当前的实例化是什么?

c++
  •  1
  • Krystian S  · 技术社区  · 7 年前

    我在查看依赖名称的引用,并且遇到了当前的实例化。但是,我很难理解它的措辞。以下是相关链接:

    https://en.cppreference.com/w/cpp/language/dependent_name#Current_instantiation

    它指出名称可以被推断为引用当前的实例化,但它从未真正定义什么可以是当前的实例化,也不能是当前的实例化,只是显示示例,并告诉您什么可以引用它。

    有人能解释什么是当前的实例化吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   aschepler    7 年前

    非正式地说,短语“当前实例化”和“当前实例化的成员”被定义为建立一个规则,在类模板的范围内,该类及其成员的名称适用于大多数被视为非依赖名称的语法要求。这样可以减少编写类模板的繁琐工作,减少对 typename template 关键字,显式 this-> 成员访问表达式等。

    该cppreference页在“只有以下名称可以引用当前实例化”下面的四个要点中定义了什么可以是当前实例化,什么不能是当前实例化。(尽管“唯一”可能不是最好的措辞。)该列表与标准中的正式定义非常相似,见 [temp.dep.type]/1 .

    请注意,即使标准和cppreference.com提到 这个 当前实例化”,在代码中的单个点上,多个类类型可以限定为当前实例化。例如,如果我们

    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 & lt;x & gt;:: 类型名A<Std::Decay_t<X>>::B 是同一类型的 A<int>::B ,这不会改变模板中的任何内容拼写的事实 类型名A<Std::Decay_t<X>>::B 仍然是未知专业化的成员,而不是当前专业化的成员。