variadic模板必须具有可调用的特殊化,非空参数包才能格式正确吗?

时间:2017-11-15 21:26:54

标签: c++ c++11 templates language-lawyer variadic-templates

一方面,存在规则[temp.res]/8.3,该规则指出如果可变参数模板的每个有效特化都需要空模板参数包,则程序格式错误且不需要诊断。另一方面,可以想象当一个人可以明确地实例化模板的任何所需特化而不能称之为[temp.mem]/5.note-1时的情况,例如:

self.comboBox.activated[str].connect(self.on_combo_activated)

代码是否格式正确或者除了具有空模板参数包的代码之外无法调用任何有效的专业化这一事实违反了[temp.res] /8.3规则?

1 个答案:

答案 0 :(得分:1)

这让我想起了一些Haskell函数{{3}}:

-- | Since 'Void' values logically don't exist, this witnesses the logical
-- reasoning tool of \"ex falso quodlibet\".
absurd :: Void -> a

这意味着一个函数采用Void的实例并返回任何类型的实例。说一个函数可以从无到有发明任何类型的实例是什么意思?这没关系,因为你无法想出一个Void的实例来传递它。

同样在这里。在我看来,代码是格式良好的,如果愚蠢的话。这里没有任何内容要求 Ts...成为空包。如果Ts...非空,则程序仍然可以。没有办法使Ts...非空的事实似乎是正交的 - 如果你能想出一个非空Ts的构造导致程序形成不良,可能[ temp.res] /8.3会适用 - 但你不能这样...... ¯\_(ツ)_/¯