首页 > 解决方案 > 为什么来自 libcxx 的 __dependent_type 使用模板非类型参数 bool _Dummy?

问题描述

以下是 __dependent_type 的定义:

template <class _Tp, bool>
struct _LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp {};

所有用例:

/usr/.../c++/v1 >>> rg "_dependent_type"                                                                                                                      
memory
2211:          __dependent_type<is_default_constructible<_T1>, _Dummy>::value &&
2212:          __dependent_type<is_default_constructible<_T2>, _Dummy>::value
2402:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
2406:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
2410:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
2412:  template <bool _Dummy, class _Deleter = typename __dependent_type<
2671:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__lval_ref_type;
2675:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
2679:      typename __dependent_type<_DeleterSFINAE, _Dummy>::__bad_rval_ref_type;
2681:  template <bool _Dummy, class _Deleter = typename __dependent_type<

variant
1134:            enable_if_t<__dependent_type<is_default_constructible<__first_type>,
1292:              __dependent_type<is_move_constructible<_Types>, _Dummy>::value &&
1293:              __dependent_type<is_swappable<_Types>, _Dummy>::value)...>::value,

tuple
621:            __lazy_all<__dependent_type<is_default_constructible<_Tp>, _Dummy>...>

问题:

不是吗

template <class _Tp>
struct _LIBCPP_TEMPLATE_VIS __dependent_type : public _Tp {};

 __dependent_type<is_default_constructible<_T1>>::value

足够的?

为什么 libcxx 需要这个虚拟布尔值?

标签: c++templateslibc++

解决方案


它是bool使类型依赖的虚拟对象,这是 的重点__dependent_type,否则您可以只使用类型本身。

以这段代码为例:

  template <bool _Dummy>
  using _GoodRValRefType =
      typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;

如果没有 dummy 使其成为依赖类型,当类模板被实例化时,_DeleterSFINAE::__good_rval_ref_type可能会导致硬错误,因为并非所有模板_DeleterSFINAE都有一个__good_rval_ref_type成员。

依赖类型延迟评估,以便您_GoodRValRefType稍后可以在 SFINAE 上下文中使用。


推荐阅读