通过值和隐式移动规则返回命名对象
在 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 类型的对象:
当函数Some_thing被调用时,一个实例of test 默认在函数内部创建然后返回。应用隐式移动规则,并使用移动构造函数 test(test&&) 将临时对象移动到函数返回的对象中。
因此,输出显示以下步骤:
示例 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 中堆栈上创建的对象中。
输出显示以下步骤:
示例 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中文网其他相关文章!