【发布时间】:2023-03-29 08:42:01
【问题描述】:
以下合法吗?
template<typename T>
std::enable_if_t<false, T> foo() {}
通常,我们有[temp.res]
程序格式错误,不需要诊断,如果:
- 无法为模板生成有效的特化 [...] 并且模板未实例化 [...]
显然,不能为 foo... 生成有效的特化...除非您认为 std::enable_if 可能是特化的,使得 type 以 void 的形式出现,而不管第一个 bool 参数如何。
struct S {};
template<bool B>
struct std::enable_if<B, S> : std::type_identity<void> {};
除了...您不能通过 [meta.rqmts] 专门化 std::enable_if
除非另有说明,否则为 [meta] 中指定的任何模板添加特化的程序的行为是未定义的。
总而言之,如果你写了一个模仿std::enable_if 的custom enable_if,那么第一个sn-p 是合法的。问题是禁止专门化std::enable_if是否使其非法?
这篇文章的灵感来自this 的回答。当前的形式改编自一个独立库的实现。
【问题讨论】:
-
我看不出用户定义的
enable_if会有什么帮助。enable_if取决于一个值,而不是一个类型,因此您只能将其专门用于true和false。 -
@NathanOliver 自定义
enable_if的第二个参数仍然是一个可以专门化的模板参数,就像在第二个sn-p 中一样。只是我们通常不会那样想。 -
啊哈。我想你可以这样做,但是你并没有真正按照你所说的去做。
enable_if<false, T>应该评估为无,因此它可以正常工作。听起来你真正需要的是std::conditionial,而不是std::enable_if。 -
如果你不被允许做一件事,那么做你不被允许做的事情就是非法的。从那时起,您可能做了什么其他已不再重要。我不明白问题是什么。
-
如standard 中所指定,
std::enable_if不能从编译器获得虚拟特化以具有(无法访问的)有效类型。
标签: c++ language-lawyer