Я пытаюсь получить более глубокое понимание С++, прочитав стандарт С++ 14 вместе с источником libС++ и libstdС++. Реализация различных элементов type_traits
варьируется между двумя, особенно is_move_assignable
, и я пытаюсь выяснить, какая из них "более правильная".
LibС++:
template <class _Tp> struct is_move_assignable
: public is_assignable<typename add_lvalue_reference<_Tp>::type,
const typename add_rvalue_reference<_Tp>::type> {};
libstdС++:
template<typename _Tp, bool = __is_referenceable<_Tp>::value>
struct __is_move_assignable_impl;
template<typename _Tp>
struct __is_move_assignable_impl<_Tp, false>
: public false_type { };
template<typename _Tp>
struct __is_move_assignable_impl<_Tp, true>
: public is_assignable<_Tp&, _Tp&&>
{ };
template<typename _Tp>
struct is_move_assignable
: public __is_move_assignable_impl<_Tp>
{ };
Стандартные состояния:
Для ссылочного типа
T
, тот же результат, что иis_assignable<T&, T&&>::value
, иначеfalse
.
Первое, что я заметил, это то, что libС++ применяет const
ко второму параметру шаблона, что не кажется правильным, поскольку оператор присваивания переходов принимает неконстантное значение r. libstdС++ также использует __is_referenceable
, который следует за формулировкой стандарта, но libС++ этого не делает. Это требование распространяется на использование libС++ add_lvalue_reference
и add_rvalue_reference
, которые обе обеспечивают __is_referenceable
самостоятельно?
Я был бы очень признателен за понимание того, почему каждый проект выбрал свои решения!