私は、C++ 14の標準をlibC++とlibstdC++のソースとともに読んで、C++について深く理解しようとしています。さまざまなtype_traits
アイテムの実装は、特にis_move_assignable
の2つで異なり、どちらが「正しい」かを判断しようとしています。libC++とlibstdC++ std :: is_move_assignable:どちらが一番正しいですか?
のlibC++:
template <class _Tp> struct is_move_assignable
: public is_assignable<typename add_lvalue_reference<_Tp>::type,
const typename add_rvalue_reference<_Tp>::type> {};
のlibstdC++:
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
、と同じ結果は、そうでなければfalse
。
私が指摘まず最初にlibC++が移動代入演算子は、非const右辺値をとるので、右のようではありません2番目のテンプレートパラメータにconst
を適用することです。 libstdC++は__is_referenceable
も使用していますが、これは標準の言葉に従いますが、libC++では使用できません。その要件はlibC++のadd_lvalue_reference
とadd_rvalue_reference
の使用でカバーされていますか?どちらも独自に__is_referenceable
を適用していますか?
それぞれのプロジェクトがソリューションを選択した理由について、私は本当に洞察に感謝します。
参照可能なものについては、その 'const'は無意味です(参照型に適用するとcv修飾子は無視されます)。 –
@ T.C。ありがとう!作者が 'const'を追加した理由は何ですか? –
多くの場合、次のような応答時間を得ることはできません:https://github.com/llvm-mirror/libcxx/commit/a75b75f514c5c92c8ad8d304b76a01a979b6134c :-) –