我想通过阅读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 :-) –