gpt4 book ai didi

c++ - std::conjunction 中的短路是如何工作的

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:46 24 4
gpt4 key购买 nike

<分区>

给定以下代码 ( https://wandbox.org/permlink/Eof3RQs49weJMWan )

#include <tuple>
#include <type_traits>
#include <utility>

template <typename T>
inline constexpr auto always_false = false;

template <typename T>
class HardError {
static_assert(always_false<T>);
};

int main() {
std::ignore = std::conjunction<std::false_type, HardError<int>>{};
}

我试图理解为什么 std::conjunction 不会出错如上所述。我知道这是为了允许短路,所以这不会发生,这是设计使然。

但是,我不明白允许这种情况发生的语言规则。鉴于 std::conjunction 的实现下面

template<class...> struct conjunction : std::true_type { };
template<class B1> struct conjunction<B1> : B1 { };
template<class B1, class... Bn>
struct conjunction<B1, Bn...>
: std::conditional_t<bool(B1::value), conjunction<Bn...>, B1> {};

我们最终继承了 std::conditional 的特化

template<class T, class F>
struct conditional<false, T, F> { typedef F type; };

这需要两种类类型进行实例化。那么conjunction<Bn...>是怎样的呢?被语言省略了?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com