【发布时间】: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<int>::X1<int>(...)、X1 和Y。
首先考虑Y<int>::X2<int>{...},X2 Y 第二。
【问题讨论】:
-
它的意思是“当模板被使用并且类型被结晶时”。例如。
std::vector<double>是模板std::vector<...>的“实例化点”。 -
您的示例中没有模板专业化。
-
@Jean-BaptisteYunès 是的,你是对的,我已经尝试解决这个问题
标签: c++ templates metaprogramming instantiation