首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >libc++和libstdc++ std::is_move_assignable:哪个最正确?

libc++和libstdc++ std::is_move_assignable:哪个最正确?
EN

Stack Overflow用户
提问于 2016-10-12 04:29:35
回答 3查看 979关注 0票数 17

我试图通过阅读C++标准以及libc++和libstdc++的源代码来更深入地理解C++14。不同的type_traits项的实现在这两种情况下各不相同,尤其是is_move_assignable,我正在尝试找出它们中的哪一个“更正确”。

libc++:

代码语言:javascript
复制
template <class _Tp> struct is_move_assignable
    : public is_assignable<typename add_lvalue_reference<_Tp>::type,
                           const typename add_rvalue_reference<_Tp>::type> {};

libstdc++:

代码语言:javascript
复制
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_referenceadd_rvalue_reference所覆盖了,这两个语言都是自己执行__is_referenceable的?

如果您能深入了解每个项目选择解决方案的原因,我将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-10-12 05:49:57

对于任何可引用的东西,这两个实现都做了同样的事情,因为libc++中的无关const是没有意义的,但也是无害的。

(从差异来看,在我看来肯定是暂时的疯狂:)似乎是一个(错误的)is_copy_assignable实现造成的C&P问题。)

对于任何不可引用的类型(例如,cv void或可恶的函数类型),libstdc++返回false_type

在libc++中,add_{l,r}value_reference原封不动地返回它(这取决于C++14之后的问题解决方案)。在顶部散布const不会对AFT产生任何影响,而会为voidy类型添加一个const

然后我们转到is_assignable,它为T == U == some AFTT == some void typeU = some const-qualified void type测试declval<T>() = declval<U>()的良好性。在所有情况下,表达式都是病态的(以一种对SFINAE友好的方式),因此我们得到了false_type

这两个是等价的。

票数 7
EN

Stack Overflow用户

发布于 2016-10-12 05:06:21

,谢谢!那么,你知道作者为什么要添加const吗?

我最好的猜测是暂时的(希望)精神错乱:

https://github.com/llvm-mirror/libcxx/commit/6063ec176d5056683d6ddd310c2e3a8f1c7e1b46#diff-48f5ee43879b5ad38888f0a6ead10113R1245

;-)

我删除了const并运行了当前的单元测试,没有任何失败。

票数 8
EN

Stack Overflow用户

发布于 2016-10-12 05:16:43

__is_referenceable是一个非标准的内部libstdc++例程。(这并不意味着它不好,只是我不期望libc++使用它)。此外,“可引用”的概念比is_move_assignable出现得晚得多。

在处理像int (*) (double) &&这样的“令人讨厌的函数”时,__is_referenceable是有帮助的。

看起来我需要写更多的测试:-)

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39986185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档