从cppreference.com的描述中,我得到的印象是std :: disjunction旨在使我在编译时短路,因此我可以这样使用它:
#include <type_traits>
#include <iostream>
template<nullptr_t null = nullptr>
constexpr bool does_not_compile() {
static_assert(null != nullptr);
return false;
}
void hello_world () {
if constexpr (std::disjunction_v<std::true_type, std::bool_constant<does_not_compile()>>) {
std::cout << "Hello World!" << std::endl;
}
}
但是,这不会编译,因为上述static_assert不会触发(live example),因此std :: disjunction不会短路。
但是,短路是什么意思呢?这不是||的通常行为在运行时,因为必须在编译时知道std :: disjunction的类型,并且取决于其值。
答案 0 :(得分:5)
您可以在链接到的页面上找到说明:
分离是短路的:如果存在带有
Bi
的模板类型参数bool(Bi::value) != false
,则实例化disjunction<B1, ..., BN>::value
不需要为j> i实例化Bj::value
。
短路行为涉及每种参数类型的value
成员,而不是参数类型本身。您不能在不知道模板参数的情况下实例化模板。使用std::disjunction<…>
通常需要实例化。在您的示例中
std::disjunction_v<std::true_type, std::bool_constant<does_not_compile()>>
编译器仍然必须实例化std::bool_constant<does_not_compile()>
,以便它知道整个std::disjunction<…>
是什么样子(正如您自己指出的那样)。可以保证不会实例化std::bool_constant<does_not_compile()>::value
…