首页 > 后端开发 > C++ > 正文

当移动构造函数不可用时,为什么隐式移动规则更喜欢复制构造函数而不是移动构造函数?

Mary-Kate Olsen
发布: 2024-11-05 10:36:02
原创
961 人浏览过

Why Does the Implicit Move Rule Prefer a Copy Constructor Over a Move Constructor When the Move Constructor is Unavailable?

使用隐式移动规则按值返回类对象

当从函数按值返回类的对象时,隐式移动规则规则开始发挥作用。此规则确定使用哪个构造函数来初始化返回的对象。通常,如果对象被视为 xvalue(可以从中移动的表达式),则首选移动构造函数。

示例 1 中,我在 Some_thing() 中声明的变量函数是 xvalue,因为它是在局部作用域中声明的,并且被认为是符合移动条件的。因此,将调用移动构造函数 test(test&& s),如输出所示。

但是,在 示例 2 中,您删除了移动构造函数并将复制构造函数修改为 test (测试&z)。此更改导致输出显示对复制构造函数 test(test& z) 的调用,而不是移动构造函数,这是由于隐式移动规则而预期的。

出现这种看似矛盾的行为是因为 i 仍被视为xvalue,但编译器现在也认为“常规”复制构造函数是可行的。隐式移动规则首先尝试使用移动构造函数,但由于没有移动构造函数,因此它继续使用复制构造函数。

要显式强制使用移动构造函数,您可以删除复制构造函数,如示例3所示。这可以防止编译器将复制构造函数视为一个选项,并且即使将移动构造函数标记为 const(通常会阻止移动),也会使用移动构造函数。

示例 4 演示了如果移动构造函数可用并且移动操作为 noexcept,则仍可以移动 const 对象。在这种情况下,u 初始化期间创建的临时对象被移动到 r,从而导致调用移动构造函数。

以上是当移动构造函数不可用时,为什么隐式移动规则更喜欢复制构造函数而不是移动构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板