【问题标题】:How can I understand the meaning of "Point of Instantiation"我如何理解“实例化点”的含义
【发布时间】:2019-01-14 11:19:46
【问题描述】:

我现在正在向non-constant-constant-expressions 学习一些元编程技能,我对“点实例化”感到困惑。作者说

每当在需要实例化的上下文中引用模板特化时,该上下文就会产生一个“实例化点”(它实际上表示允许编译器为所引用的模板特化生成代码的位置)。

如果在依赖于某个周围模板 Y 的模板参数的上下文中引用模板特化 X,则给定的实例化点取决于 Y 的实例化点。

  • 如果 X 是函数模板特化,则实例化点是 Y。
  • 如果 X 是类模板特化,则实例化点就在 Y 的实例化点之前。

否则,给定的实例化点与包含引用 X 的语句的命名空间范围声明/定义 (D) 的位置相关联。

  • 如果 X 是函数模板特化,则实例化点紧接在 D 之后。
  • 如果 X 是类模板特化,则实例化点就在 D 之前。

我不知道“模板特化 X 在依赖于某个周围模板 Y 的模板参数的上下文中被引用”是什么意思

template<typename T>
class Y{
    template<typename U1> void X1(){...};
    template<typename U2> class X2{...};
}

考虑同时实例化Y&lt;int&gt;::X1&lt;int&gt;(...)X1Y

首先考虑Y&lt;int&gt;::X2&lt;int&gt;{...}X2 Y 第二。

【问题讨论】:

  • 它的意思是“当模板被使用并且类型被结晶时”。例如。 std::vector&lt;double&gt; 是模板 std::vector&lt;...&gt; 的“实例化点”。
  • 您的示例中没有模板专业化。
  • @Jean-BaptisteYunès 是的,你是对的,我已经尝试解决这个问题

标签: c++ templates metaprogramming instantiation


【解决方案1】:

这只是意味着,给定

template<class> class A {};
template<class T> void f(T) {}
template<class T> void g() {f(A<T>{});}

(比如)A&lt;int&gt; 的实例化点就在f&lt;int&gt;g&lt;int&gt; 共享的点之前。 (请记住,函数(但不是类)模板可以在翻译单元中包含 more than one point of instantiation。)

【讨论】:

  • 在这种情况下,A 之于 X 就像 g 之于 Y 一样,因为 X 在 g 中被引用,所以它在 g 之前立即实例化。由于“否则”规则,f 和 g 在同一时间点实例化。是真的吗?
  • @calvin:关于A 是的,但是fA 被第一个项目符号覆盖。抱歉,我忘记使用它而掩盖了这一点。
猜你喜欢
  • 2018-12-03
  • 1970-01-01
  • 1970-01-01
  • 2015-10-24
  • 1970-01-01
  • 2019-05-26
  • 2013-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多