首页  >  文章  >  后端开发  >  按值返回对象何时触发移动构造函数?

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

Patricia Arquette
Patricia Arquette原创
2024-11-04 08:51:30325浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn