“如果引用专业化的上下文取决于模板参数”的含义是什么?

Bri*_*ian 9 c++ templates language-lawyer

根据C ++ 17标准[temp.point] / 4,重点是

对于类模板专业化,类成员模板专业化或对类模板的类成员的专业化,如果该专业化是隐式实例化的,因为该专业化是从另一个模板专业化内部引用的,则如果引用该专业化的上下文取决于在模板参数上,并且如果未在封闭模板的实例化之前实例化专门化,则实例化点紧接在封闭模板的实例化点之前。否则,此类专门化的实例化点紧接在引用该专门化的名称空间范围声明或定义之前。

我不懂如何解释这句话。在其他地方,当描述模板中的名称查找时,该标准指的是“实例上下文”和“定义上下文”。此处,“上下文”一词似乎表示源文本中的特定点,它决定了可见名称的集合。在这里,我不确定“上下文”的含义是否相同。如果那是什么意思,我不确定依赖模板参数对它意味着什么。这是否意味着它在模板内部,还是具体意味着在编译器决定实例化所讨论的专业化时,封闭模板中仍然存在一些未绑定的模板参数?

例子将不胜感激。

Oli*_*liv 4

此上下文出现在封闭模板内(来自另一个模板专业化依赖于模板参数)。它必须依赖于封闭模板的模板参数,因此它可能是封闭模板的定义上下文内的上下文。

所以我想这一段可以用这个例子来说明:

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>
Run Code Online (Sandbox Code Playgroud)