为什么来自 libcxx 的 __dependent_type 使用模板非类型参数 bool _Dummy?
why __dependent_type from libcxx uses a template non-type parameter 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 需要这个虚拟布尔值?
使类型依赖的是虚拟 bool
,这是 __dependent_type
的重点,否则你可以只使用类型本身。
以这段代码为例:
template <bool _Dummy>
using _GoodRValRefType =
typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
如果没有使它成为依赖类型的虚拟对象,当实例化 class 模板时,_DeleterSFINAE::__good_rval_ref_type
可能会导致硬错误,因为并非所有 _DeleterSFINAE
都有 __good_rval_ref_type
会员.
依赖类型会延迟评估,以便您稍后可以在 SFINAE 上下文中使用 _GoodRValRefType
。
这里是__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 需要这个虚拟布尔值?
使类型依赖的是虚拟 bool
,这是 __dependent_type
的重点,否则你可以只使用类型本身。
以这段代码为例:
template <bool _Dummy>
using _GoodRValRefType =
typename __dependent_type<_DeleterSFINAE, _Dummy>::__good_rval_ref_type;
如果没有使它成为依赖类型的虚拟对象,当实例化 class 模板时,_DeleterSFINAE::__good_rval_ref_type
可能会导致硬错误,因为并非所有 _DeleterSFINAE
都有 __good_rval_ref_type
会员.
依赖类型会延迟评估,以便您稍后可以在 SFINAE 上下文中使用 _GoodRValRefType
。