根据C ++ 17标准[temp.point] / 4,强调我的意思,
对于类模板专业化,类成员模板专业化或类的专业化 类模板的成员,如果专门化是隐式实例化的,因为它是从内部引用的 另一个模板专业化,(如果引用专业化的上下文取决于 模板参数,并且如果未在封装实例化之前实例化专业化 模板,实例化点紧接在封闭模板的实例化点之前。 否则,这种专门化的实例化点紧接在命名空间范围之前 涉及专业化的声明或定义。
我不明白如何解释这句话。在其他地方,当描述模板中的名称查找时,该标准指的是“实例上下文”和“定义上下文”。此处,“上下文”一词似乎表示源文本中的特定点,它决定了可见名称的集合。在这里,我不确定“上下文”的含义是否相同。如果那是什么意思,我不确定依赖模板参数对它意味着什么。这是否意味着它在模板内部,还是具体意味着在编译器决定实例化所讨论的专业化时,封闭模板中仍然存在一些未绑定的模板参数?
示例将不胜感激。
答案 0 :(得分:4)
此上下文显示在封闭的模板内部(来自另一个模板专业化,取决于模板参数)。它必须取决于封闭模板的template参数,因此它可能是封闭模板的定义上下文中的上下文。
所以我想可以通过以下示例说明这一段:
template<class T> struct A{};
template<class T> struct B{};
//point of instantiation of B<int>
template<class T> void f(){
A<T> a; //The context depends on enclosing template parameter T
B<int> b; //The context does not depend on a template parameter.
}
//
void g(){
f<double>();
}
//point of instantiation of A<double>
//point of instantiation of f<double>
答案 1 :(得分:0)
[这实际上是对@Oliv答案的扩展评论,而不是答案本身。]
[temp.point]是[temp.dep.res]的子节,它是“从属名称解析”。
这里的意思是我可能在此订单上有东西:
template <class T>
class foo {
using name = int;
};
template <>
class foo<float> {
using name = long;
};
template <class T>
class bar {
foo<typename T> f; // Point A
};
在点A,f::name
的含义取决于实例化T
的{{1}},因为在bar
上实例化foo使用{{1}的特殊化}。
至少在我阅读本书时,这就是所讨论的段落旨在表示某些含义的上下文(请原谅,该术语更重载)。
答案 2 :(得分:0)
“实例化上下文”是指在源代码中发生实例化的点。该标准定义了每个实例化场景的那个点,因此命名为“实例化点”。
“ context”和“ depend”两个词在口语中的含义分别是英语中的含义,即“在源代码中放置”和“由...确定”。因此,必不可少的是,该构造必须出现在模板内部(又称“引用了专业化知识的上下文” ),以便依赖某些模板参数。
template<typename> struct A {};
// Point of instantiation for A<int>
template<typename T>
struct B
{
A<int> a1;
A<T> a2; // Depends on T
};
// Point of instantiation for A<char>
// Point of instantiation for B<char>
void foo()
{
B<char> b;
}
这种定义的重点(对双关语)是根据源代码中特定点上的类的完整性来定义任何构造的行为。规则看似很复杂,重要的是Is stateful metaprogramming ill-formed (yet)?