std::bool_constant 背后的理由

Rationale behind std::bool_constant

我想知道,引入 std::bool_constant 及其随后用于 std::true_typestd::false_type 的基本原理是什么(以及 [=36= 中定义的比较结构) ] <ratio>, cf. N4389) 在 C++17 中?

到目前为止,我只能找到包含以下措辞的论文:

虽然两篇论文都提到了 "rationale" -- https://issues.isocpp.org/show_bug.cgi?id=51 -- linked-to 评论提要大多指出这是 "Based on the discussion on c++std-lib*"(大概指的是私有反射器?),无需深入了解。

这是文档: http://en.cppreference.com/w/cpp/types/integral_constant

它是纯粹的语法糖。通常,我们使用例如像这样发送标签:

void foo_impl(std::false_type) { /*Implementation for stuff (and char) */}
void foo_impl(std::true_type ) { /*Implementation for integers but not char*/}

template <typename T>
void foo(T) {
    foo_impl(t, std::bool_constant<std::is_integral<T>{} && !std::is_same<char, T>{}>());
}

如果没有 bool_constant,我们将不得不使用更长的类型说明符来指定所需的类型:std::integral_constant<bool, ...>。由于对布尔值使用 integral_constant 的情况特别频繁,因此需要一种简明扼要的方式来处理专业化,而 bool_constant 提供了这一点。
事实上,bool_constant 只不过是 bool 的别名模板 - integral_constant 的特化:

template <bool B>
using bool_constant = integral_constant<bool, B>;

更改 true_typefalse_type(以及 integral_constant<bool, ..> 的其他用途)的声明的唯一原因是为了标准的简洁性,甚至;没有技术需求,因为 integral_constant<bool, false>bool_constant<false> 指定完全相同的类型。