不参与推导的模板参数包推为空的现行规则草案中的规范规则是什么?

jac*_*k X 5 c++ templates language-lawyer

template<typename ...T, typename U>
void fun(U){}
int main(){
   fun(0);
}
Run Code Online (Sandbox Code Playgroud)

这个片段代码被 GCC 和 Clang 接受。模板参数包T不参与函数调用上下文中的模板参数推导,遵循以下规则:
[temp.deduct.call]

模板参数推导是通过将包含参与模板参数推导的模板参数的每个函数模板参数类型(称为 P)与调用的相应参数(称为 A)的类型进行比较来完成的,如下所述。

该包T包含在任何函数模板参数中。如果没有指定其他特殊规则,则扣除将根据:
[temp.deduct.type#2]

如果任何模板参数既未推导也未明确指定,则模板参数推导失败。

但是,这种情况在现行标准中是由以下规则来规定的,即: [temp.arg.explicit#4]

未以其他方式推导的尾随模板参数包 ([temp.variadic])将推导为模板参数的空序列

因此,上述情况可以被认为是成功地推导出T了一个空的模板参数集。

但是,temp.arg.explicit#4 中的特殊规则已更改为当前草案中的注释

[temp.arg.explicit#note-1]

[注 1:未以其他方式推导出的尾随模板参数包 ([temp.variadic]) 将推导出为模板参数的空序列。— 尾注]

所以,我想知道当前草案中是否有任何替代规范规则规定T未以其他方式推断的包将被推断为一组空的模板参数?

dfr*_*fri 0

[temp.arg.explicit]/4 之前的规范部分

[...] 未以其他方式推导的尾随模板参数包 ([temp.variadic]) 将被推导为模板参数的空序列。[...]

被制成非规范性注释,作为P1787R6的一部分。

正如您所指出的,根据[temp.deduct.type]/2 [重点是我的]:

类型推导是针对每个P/A对 [...] 独立完成的,如果任何模板参数既没有推导也没有显式指定,则模板参数推导失败。

[temp.arg.general]描述了作为模板参数包的模板参数可以对应于零个模板参数

[...] 当模板声明的参数是模板参数包时,它将对应零个或多个template-arguments

[temp.variadic]/1明确提到模板参数包可以接受零参数:

模板参数包是接受零个或多个模板实参的模板参数。

接下来是通过参数包模板参数模板化的实体的空参数列表的非规范示例:

template<class ... Types> struct Tuple { };
Tuple<> t0;  // Types contains no arguments
Run Code Online (Sandbox Code Playgroud)

现在,返回到[temp.arg.explicit]/4

如果所有模板参数都可以推导,则可以全部省略;在这种情况下,空模板参数列表<>本身也可以被省略。

这意味着Tuple上面的示例同样可以省略空参数列表

Tuple t0;  // Also OK: Types contains no arguments
Run Code Online (Sandbox Code Playgroud)

但关键是,根据上面的 [temp.arg.general],模板参数列表可能对应于零个参数,在这种情况下,不需要推断出模板参数。

如果你看看你自己的例子:

template<typename ...T, typename U>
void fun(U){}
int main(){
   fun(0);  // #1
}
Run Code Online (Sandbox Code Playgroud)

您同样可以调用#1为:

fun<>(0);  // argument list for parameter pack is empty
           // -> no argument (beyond that for `U`) to deduce
Run Code Online (Sandbox Code Playgroud)

强调与模板参数相对应的U可推论参数可以从显式模板参数中省略,而其余模板参数都是 none;即,作为模板参数包的模板参数的实参列表为空,因此没有剩余的模板实参需要推导。

因此

未以其他方式推导的尾随模板参数包 ([temp.variadic]) 将被推导为模板参数的空序列。

是非规范/冗余的,解释了为什么它被包装到[Note - [...] - end note]中。