我想通過閱讀C++ 14標準以及libC++和libstdC++的源文件來深入理解C++。各種type_traits
項目的執行情況在兩者之間有所不同,尤其是is_move_assignable
,我試圖找出哪些是「更正確的」。libC++ vs 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
到第二個模板參數,這看起來不正確,因爲此舉賦值運算符需要一個非const右值。 libstdC++也使用__is_referenceable
,它遵循標準的措辭,但libC++不符合。 libC++使用add_lvalue_reference
和add_rvalue_reference
是否滿足這個要求,它們都自己執行__is_referenceable
?
我真的很感謝每個項目爲什麼選擇他們的解決方案!
對於任何可引用的參數,'const'是無意義的(當應用於引用類型時,cv-qualifiers被忽略)。 –
@ T.C。謝謝!任何想法爲什麼作者可能添加了'const',那麼? –
通常情況下你可以得到這樣的響應時間:https://github.com/llvm-mirror/libcxx/commit/a75b75f514c5c92c8ad8d304b76a01a979b6134c :-) –