“用作非类型模板参数”是否使函数模板隐式实例化?

问题描述

我想编写一个接受不完整类型 import pyglet import PySimpleGUI as sg # pyglet.font.add_file(r".\MerryChristmasFlake.ttf") # pyglet.font.add_file(r".\MerryChristmasstar.ttf") sg.theme("DarkBlue3") font1 = ("Merry Christmas Flake",40) font2 = ("Merry Christmas Star",40) layout = [ [sg.Text("Merry Christmas Flake",font=font1)],[sg.Text("Merry Christmas Star",font=font2)],] window = sg.Window('Title',layout,finalize=True) while True: event,values = window.read() if event == sg.WINDOW_CLOSED: break print(event,values) window.close() 作为模板参数的类模板 M。 但我也希望 C 在最终定义时具有一些特征。

代码是否有保证

  • 编译(如果已定义),
  • 如果 !defined(FLAG) 编译失败?
C

解决方法

From a n4713,

实例化点 [temp.point] (17.7.4.1/8)

函数模板、成员函数模板或类模板的成员函数或静态数据成员的特化可能在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于在翻译单元内具有实例化点的任何此类特化,翻译单元的结尾也被视为实例化点。类模板的特化在翻译单元内最多有一个实例化点。任何模板的特化都可能在多个翻译单元中具有实例化点。如果根据一个定义规则(6.2),两个不同的实例化点赋予模板特化不同的含义,则该程序格式错误,无需诊断。

首先,请注意主要模板是 paa0ssed arguments 一个专业化的标准发言。根据我的经验,C++ 程序员使用它的方式与标准不同。

其次,check<Test> 在你的程序中有两个实例化点;一次在

M<Test> m;

并且一次在翻译单元的末尾。

check<Test> 处的 M<Test> m 的含义与翻译单元末尾的 check<Test> 的含义不同。一方面,Test 是不完整的,另一方面是完整的。 check<Test> 的主体肯定有不同的含义。

所以你的程序格式错误,不需要诊断。在您的情况下,格式错误的程序恰好可以执行您想要的操作,但它可能(根据标准)编译为任何内容,或者无法编译。

我怀疑这条规则背后的原因是让编译器可以自由地立即实例化 check 或推迟到稍后实例化。您不能依赖于它实际对 check 的主体进行实例化的两个点中的哪一个。