从什么意义上说std :: disjunction在compile_time短路

时间:2019-04-01 20:58:50

标签: c++ std c++17 variadic-templates if-constexpr

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的类型,并且取决于其值。

1 个答案:

答案 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