关于实例化上下文的问题

jac*_*k X 8 c++ language-lawyer c++20

考虑module.context p7中的以下示例

//Translation unit #1:

export module stuff;
export template<typename T, typename U> void foo(T, U u) { auto v = u; }
export template<typename T, typename U> void bar(T, U u) { auto v = *u; }  

//Translation unit #2:

export module M1;
import "defn.h";        // provides struct X {};
import stuff;
export template<typename T> void f(T t) {
  X x;
  foo(t, x);
}

// Translation unit #3:

export module M2;
import "decl.h";        // provides struct X; (not a definition)
import stuff;
export template<typename T> void g(T t) {
  X *x;
  bar(t, x);
}

// Translation unit #4:

import M1;
import M2;
void test() {
  f(0);
  g(0);
}
Run Code Online (Sandbox Code Playgroud)

对于f(0),评论说

foo<int, X> 的实例化上下文包括

  • 翻译单元 #1 末尾的点,
  • 翻译单元 #2 末尾的点,以及
  • 调用 f(0) 的点,

我能理解第一点,因为这个规则

在其实例化点被指定为封闭专业化 ([temp.point]) 的模板的隐式实例化期间,实例化上下文是封闭专业化的实例化上下文的并集,并且如果模板是在模块 M 的模块接口单元,并且实例化点不在 M 的模块接口单元中,即 M 的主模块接口单元的声明序列末尾的点(在 private-module-fragment 之前,如果有的话)

然而,我无法弄清楚剩下的几点,尤其是第二点。这两点该如何解读呢?

更新:

来自@Nicol Bolas的回答

因此,“封闭专业化的实例化上下文”foo是 的实例化上下文f根据您引用和强调的内容,其中包括《TU2》的结尾

我不认为强调的措辞表明封闭专业化的实例化上下文包含“TU2 的结束”。我认为整个 [module.context#3] 应该这样解析

在模板 T的隐式实例化期间,其实例化点被指定为封闭特化 ([temp.point]) 的点,实例化上下文是封闭特化的实例化上下文的并集,并且如果定义了模板 T在模块 M 的模块接口单元中,并且实例化点不在 M 的模块接口单元中,即 M 的主模块接口单元的声明序列末尾的点(在私有模块之前)片段,如果有的话)。

该模板T不指定实例化封闭专业化的模板。

Nic*_*las 4

所有这些都可以追溯到您引用的内容,但没有点击以下链接:“封闭专业化”。从[温度点]/1开始:

对于函数模板专业化、成员函数模板专业化或类模板的成员函数或静态数据成员的专业化,如果该专业化是隐式实例化的,因为它是从另一个模板专业化及其所在上下文中引用的引用取决于模板参数,特化的实例化点就是封闭特化的实例化点。

在 TU2 中,功能模板foo在功能模板内专门化ff是 的“封闭专业化” foo

因此,“封闭专业化的实例化上下文”foo是 的实例化上下文f。根据您引用和强调的内容,其中包括《TU2》的结尾。

至于第三点……只是为了使用而重复的第二点ff(0)专门化f,从而充当其实例化上下文的一部分。因为foo包含在其中f,所以这也充当 的实例化上下文的一部分foo

  • 换句话说,哪个项目符号明确表示“f”特化的实例化上下文包含“TU2”的结尾? (3认同)
  • @Swift-FridayPie 该规则不适用于“f()”和“g()”,尽管它们是模板专业化,但它们在**封闭的专业化**中没有被引用。 (2认同)