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

时间:2019-06-28 19:45:40

标签: c++ templates language-lawyer

根据C ++ 17标准[temp.point] / 4,强调我的意思,

  

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

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

示例将不胜感激。

3 个答案:

答案 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)?