首页  >  文章  >  后端开发  >  当在 C 中按值返回命名对象时,隐式移动规则是否适用?

当在 C 中按值返回命名对象时,隐式移动规则是否适用?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-07 11:00:03644浏览

When Returning a Named Object by Value in C  , Does the Implicit Move Rule Apply?

通过值和隐式移动规则返回命名对象

在 C 中,可以通过引用或通过函数从函数返回对象价值。当按值返回时,对象被复制或移动,具体取决于上下文。当从临时对象的函数按值返回对象时,将应用隐式移动规则。

示例 1:移动构造函数

考虑下面的示例:

<code class="cpp">class test {
public:
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(const test& z) {
        printf("test(const test&z)\n");
    }
    test(test&& s)noexcept{
            printf("test(test&& s)\n");          
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>

此示例使用以下构造函数按值返回 test 类型的对象:

  • test(int):接受整数参数的构造函数
  • test (): 默认构造函数
  • test(const test&): 复制构造函数
  • test(test&&): 移动构造函数

当函数Some_thing被调用时,一个实例of test 默认在函数内部创建然后返回。应用隐式移动规则,并使用移动构造函数 test(test&&) 将临时对象移动到函数返回的对象中。

因此,输出显示以下步骤:

  • test()
  • test(test&& s)

示例 2:复制构造函数

现在,让我们考虑这个修改后的例如:

<code class="cpp">class test {
public:
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(test& z) {
        printf("test(test&z)\n");
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>

在这种情况下,移动构造函数 test(test&&) 不可用。相反,复制构造函数 test(test&) 用于将函数返回的临时对象复制到 main 中堆栈上创建的对象中。

输出显示以下步骤:

  • test()
  • test(test&z)

示例 3:删除 Move 构造函数

最后,如果我们显式删除 move像这样的构造函数:

<code class="cpp">class test {
public:
    test(test&& z) = delete;
    test(int y) {
        printf("test(int y)\n");
    }
    test() {
        printf("test()\n");
    }
    test(const test& z) {
        printf("test(test&z)\n");
    }
    test& operator=(test e) {
        printf("test& operator=(test e)\n");
        return *this;
    }
};
test Some_thing() {
    test i;
    return i;
}
int main()
{
    Some_thing();
    return 0;
}</code>

无法使用移动构造函数,编译将失败,因为没有可行的构造函数可用于返回值。

总而言之,隐式移动当从对象是临时的函数中按值返回类的对象时,将应用该规则。如果移动构造函数可用,则将使用它,如果没有,则将使用复制构造函数。如果显式删除移动构造函数,编译将失败。

以上是当在 C 中按值返回命名对象时,隐式移动规则是否适用?的详细内容。更多信息请关注PHP中文网其他相关文章!

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