按值从函数返回类的对象
考虑从函数返回类的对象的情况价值。在这种情况下,返回的对象通常被视为左值,这意味着它在内存中具有名称和地址。然而,某些情况下可能会导致返回的对象被视为右值,即没有名称或地址的临时对象。
隐式移动规则
C 定义了按值返回对象时可能应用的隐式移动规则。该规则规定,如果满足以下条件:
在这种情况下,将调用移动构造函数而不是复制构造函数。此行为旨在通过避免不必要的复制来优化性能。
示例 1
在此示例中,返回的对象 i 是左值,因此复制构造函数 test( const test& z) 被调用:
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 Some_thing() {
test i;
return i;
}
输出:
test() test(const test&z)
示例 2
但是,在下面的示例中,返回的对象 i 被视为 xvalue,移动构造函数 test( test&& s) 被调用,因为该对象是临时的并且移动构造函数是可行的:
class test {
public:
test(int y) { printf("test(int y)\n"); }
test() { printf("test()\n"); }
test(test&& s) { printf("test(test&& s)\n"); }
};
test Some_thing() {
test i;
return i;
}
输出:
test() test(test&& s)
示例 3
如果未提供或显式删除移动构造函数,则无法应用隐式移动规则,并且程序将无法编译:
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(const test&z)\n"); }
};
test Some_thing() {
test i;
return i;
}
结论
当按值返回对象时,在特定条件下可能会应用隐式移动规则,从而导致调用移动构造函数。了解这种行为对于优化代码和防止编译错误至关重要。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3