扫码关注官方订阅号
认证高级PHP讲师
因为你的移动构造函数不是noexcept的。将移动构造函数声明为noexcept(true),vector就不会调用拷贝构造函数了。
vector的push_back可能会需要扩展存储区。这一过程要将原有数据从原存储区拷贝到新申请的存储区。同时push_back需要保证在添加元素的过程中,若有操作抛出异常,容器保持push_back前的状态。因此,它不能调用可能会抛出异常的移动构造函数。因为从语义上来说,移动构造操作中断(抛出异常)会导致数据损坏。
它会调用可能抛异常的拷贝构造函数,是因为从语义上来说这么做不会导致数据损坏。当然你也可以在拷贝构造函数里搞事情。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
因为你的移动构造函数不是noexcept的。将移动构造函数声明为noexcept(true),vector就不会调用拷贝构造函数了。
vector的push_back可能会需要扩展存储区。这一过程要将原有数据从原存储区拷贝到新申请的存储区。同时push_back需要保证在添加元素的过程中,若有操作抛出异常,容器保持push_back前的状态。因此,它不能调用可能会抛出异常的移动构造函数。因为从语义上来说,移动构造操作中断(抛出异常)会导致数据损坏。
它会调用可能抛异常的拷贝构造函数,是因为从语义上来说这么做不会导致数据损坏。当然你也可以在拷贝构造函数里搞事情。