大佬教程收集整理的这篇文章主要介绍了c – 为什么移动构造函数会影响is_assignable?,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
template<typename T,typename D> struct MoveAssignOnly_V2 { MoveAssignOnly_V2& operator=(MoveAssignOnly_V2&) = delete; MoveAssignOnly_V2& operator=(MoveAssignOnly_V2&&) noexcept {} }; int main() { static_assert(not std::is_assignable_v<MoveAssignOnly_V2<int,float>,MoveAssignOnly_V2<int,double>>); }
是的,因为MoveAssignOnly_V2< int,float>和MoveAssignOnly_V2< int,double>是两种不同的类型,因此它们不可分配.
template<class U,class E> MoveAssignOnly_V2(MoveAssignOnly_V2<U,E>&& m) noexcept {}
static_assert
fail!(包括gcc和clang).
问题:为什么移动构造函数会影响is_assignable?
更新
我添加这个构造函数的原因是我发现std :: unique_ptr有一个
template< class U,class E > unique_ptr( unique_ptr<U,E>&& u ) noexcept;
,这让我有点困惑:如果它有这样一个ctor,它怎么可能不可分配?所以我尝试将此类ctor添加到MoveAssignOnly_V2并发布此问题.这两个答案都很好,但是仍然无法解释为什么当std :: unique_ptr同时具有移动赋值和这个模板化构造函数时,它不可赋值.
MoveAssignOnly_V2<int,float> lhs; MoveAssignOnly_V2<int,double> rhs; lhs = stdL::move(rhs);
当转换构造函数(注意它不是移动构造函数)不存在时,无法将rhs分配给lhs.
但是,当您添加构造函数模板时,现在有一种方法可以将rhs转换为MoveAssignOnly_V2< int,float>类型. (创建该类型的临时).然后,可以从该临时值移动到lhs.
这与以下原则相同:
double lhs = 3.14; float rhs = 42.f; lhs = std::move(rhs);
要解决问题中的更新:
您不能单独使用功能声明,您必须阅读完整规范(在标准或suitable reference中).引用有关std :: unique_ptr的转换构造函数的链接引用:
正如您所看到的,必须实现unique_ptr的转换构造函数,以便只有在源删除器可以转换为目标删除器时它才有效.这与上一个问题中的移动分配基本相同.
以上是大佬教程为你收集整理的c – 为什么移动构造函数会影响is_assignable?全部内容,希望文章能够帮你解决c – 为什么移动构造函数会影响is_assignable?所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。