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

按值返回对象何时触发移动构造函数?

Patricia Arquette
发布: 2024-11-04 08:51:30
原创
324 人浏览过

When Does Returning an Object by Value Trigger a Move Constructor?

按值从函数返回类的对象

考虑从函数返回类的对象的情况:价值。在这种情况下,返回的对象通常被视为左值,这意味着它在内存中具有名称和地址。但是,某些情况可能会导致返回的对象被视为右值,即没有名称或地址的临时对象。

隐式移动规则

C 定义了一个按值返回对象时可能应用的隐式移动规则。该规则规定,如果满足以下条件:

  • 返回的表达式是 xvalue(表示不是左值的临时对象的表达式)。
  • 返回的对象具有移动构造函数。
  • 移动构造函数是可访问的。

在这种情况下,将调用移动构造函数而不是复制构造函数。此行为旨在通过避免不必要的复制来优化性能。

示例 1

在此示例中,返回的对象 i 是左值,因此复制构造函数 test( const test& z) 被调用:

<code class="cpp">class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>
登录后复制

输出:

test()
test(const test&amp;z)
登录后复制

示例 2

但是,在以下示例中,返回的对象 i 被视为 xvalue,并且调用移动构造函数 test(test&& s),因为该对象是临时的并且移动构造函数是可行的:

<code class="cpp">class test {
public:
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(test&amp;&amp; s) { printf("test(test&amp;&amp; s)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>
登录后复制

输出:

test()
test(test&amp;&amp; s)
登录后复制

示例 3

如果未提供或显式删除移动构造函数,则无法应用隐式移动规则,程序将无法编译:

<code class="cpp">class test {
public:
    test(test&amp;&amp; z) = delete;
    test(int y) { printf("test(int y)\n"); }
    test() { printf("test()\n"); }
    test(const test&amp; z) { printf("test(const test&amp;z)\n"); }
};
test Some_thing() {
    test i;
    return i;
}</code>
登录后复制

结论

当按值返回对象时,在特定条件下可能会应用隐式移动规则,从而导致调用移动构造函数。了解这种行为对于优化代码和防止编译错误至关重要。

以上是按值返回对象何时触发移动构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!