【发布时间】:2015-08-21 00:18:07
【问题描述】:
我使用基于 SFINAE 的方法已经有一段时间了,尤其是通过std::enable_if 启用/禁用特定的类模板特化。
因此,在阅读描述提议的void_t 别名/检测成语的论文时,我有点困惑:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4502.pdf
第 4 节专门讨论成语的有效性,并指的是两方争论 SFINAE 在部分类模板专业化中的适用性的讨论(Richard Smith 指出该标准缺少关于这个话题)。在本节的最后,提到了以下 CWG 问题
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2054
这里再次声明该标准并未明确允许该问题中复制的示例。
我有点困惑,因为在我看来,例如,enable_if 在部分专业化中的使用已经成为标准实践已经有一段时间了(例如,参见 Boost 文档,其中明确提到了部分专业化)。
我是否误解了上述文档中的要点,或者这真的是一个灰色区域?
【问题讨论】:
-
这似乎是一个不错的论点,标准没有指定它,并且每个实现都可以按照您的意愿处理它,并且几乎肯定会以匹配状态的方式解决它现状?
-
@Yakk 但我有点惊讶地看到它被提升为在 Boost 和 stackoverflow 等圈子中做事的可移植方式。这是一种在早期形式中可以追溯到 C++03 的技术,它在 C++11/C++14 中没有被标准化似乎很奇怪。
-
好吧,可能没人注意到。
-
我重新阅读了标准的相关部分,这似乎是一个可能有助于明确澄清的案例。问题在于,在关于类模板规范 14.5.5.1/2 的部分中,它基本上说“查看 14.8.2”以了解实际规则。 14.8.2 确实包含了所有 SFINAE 的东西,但那是关于函数模板的部分,而不是类模板。在我看来,他们似乎不想重复自己,因此重定向 - 但听起来确实很笨重。
-
@Yakk 忘了说谢谢你的回复,你说的很有道理:)