一方面有规则[temp.res]/8.3,它规定如果可变参数模板的每个有效特化都需要一个空的模板参数包,那么程序就是格式错误,不需要诊断 . 另一方面,人们可以想象当一个人可以显式地实例化模板的任何所需特化但不能称之为[temp.mem]/5.note-1的情况时,例如:
struct foo {
template <class... Ts>
foo() { }
};
template
foo::foo<int, float, double>();
代码是否良好或者除了具有空模板参数包的那个之外不能调用任何有效的专业化这一事实违反了[temp.res] /8.3规则?
1 回答
这让我想起了一些Haskell函数absurd:
这意味着一个函数接受
Void
的实例并返回任何类型的实例 . 说一个函数可以从无空中发明任何类型的实例是什么意思?它没有提供Void
的实例来传递它 .同样在这里 . 在我看来,代码是格式良好的,如果愚蠢的话 . 这里没有任何东西 requires
Ts...
是空包 . 如果Ts...
非空,程序仍然可以 . 事实上,没有办法使Ts...
非空似乎是正交的 - 如果你能想出一个构造非空Ts
导致程序格式错误,那么[temp.res] /8.3可能适用 - 但你不能这样......¯\_(ツ)_/¯