【发布时间】:2016-10-11 20:29:35
【问题描述】:
我试图通过阅读 C++14 标准以及 libc++ 和 libstdc++ 的源代码来更深入地了解 C++。各种type_traits 项目的实现在两者之间有所不同,尤其是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,结果与is_assignable<T&, T&&>::value相同,否则为false。
我注意到的第一件事是 libc++ 将const 应用于第二个模板参数,这似乎不正确,因为移动赋值运算符采用非常量右值。 libstdc++ 也使用__is_referenceable,它遵循标准的措辞,但 libc++ 没有。 libc++ 对add_lvalue_reference 和add_rvalue_reference 的使用是否涵盖了这一要求,它们都自行强制执行__is_referenceable?
如果能深入了解每个项目为何选择他们的解决方案,我将不胜感激!
【问题讨论】:
-
对于任何可引用的东西,
const是没有意义的(当应用于引用类型时,cv 限定符被忽略)。 -
@T.C.谢谢!知道为什么作者可能会添加
const吗? -
很少有这样的响应时间:github.com/llvm-mirror/libcxx/commit/… :-)
标签: c++ c++11 c++14 libstdc++ libc++