почему __dependent_type из libcxx использует шаблонный не типовой параметр bool _Dummy? - PullRequest
0 голосов
/ 23 декабря 2018

Вот определение типа __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 нужен этот фиктивный бул?

1 Ответ

0 голосов
/ 23 декабря 2018

Это фиктивная bool, которая делает тип зависимым, в этом весь смысл __dependent_type, в противном случае вы можете просто использовать сам тип.

Взять этот код в качестве примера:

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

Без фиктивного преобразования в зависимый тип, когда создается экземпляр класса класса, _DeleterSFINAE::__good_rval_ref_type может вызвать серьезную ошибку, поскольку не все _DeleterSFINAE имеют член __good_rval_ref_type.

Зависимый тип задерживает оценку, поэтому вы можете использовать _GoodRValRefType в контексте SFINAE позже.

...