gpt4 book ai didi

c++ - 当前实例化是什么?

转载 作者:搜寻专家 更新时间:2023-10-31 02:05:01 24 4
gpt4 key购买 nike

我正在查看从属名称的引用,并且遇到了当前实例化。但是,我很难理解它的措辞。这是有问题的链接:

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

它声明名称可以推断为引用当前实例,但它从未真正定义什么可以和不能是当前实例,而只是展示示例,并告诉您什么可以引用它。

谁能解释一下什么是当前实例化?

最佳答案

通俗地说,定义“当前实例化”和“当前实例化的成员”这两个短语来建立一个规则,即在类模板的范围内,该类的名称及其成员是针对处理的大多数句法要求的像非依赖名称。这使得编写类模板不那么乏味,需要更少的 typenametemplate关键字,显式 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<X>::B 确实如此和 typename A<std::decay_t<X>>::B是同一类型A<int>::B ,这不会改变模板中拼写为 typename A<std::decay_t<X>>::B 的事实仍然是未知特化的成员,而不是当前特化的成员。

关于c++ - 当前实例化是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52618403/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com