首页  >  文章  >  后端开发  >  为什么在用另一个对象实例化一个对象时不调用 C 11 移动构造函数?

为什么在用另一个对象实例化一个对象时不调用 C 11 移动构造函数?

Linda Hamilton
Linda Hamilton原创
2024-11-05 08:20:02645浏览

Why isn't the C  11 move constructor called when instantiating an object with another object?

C 11 移动构造函数未调用,首选默认构造函数

问题:

在 C 中11、当通过另一个对象实例化一个对象时,为什么应该调用的移动构造函数却没有被调用?

答案:

实例化时,编译器可能偶尔会调用应用一种称为复制省略的技术。复制省略允许直接将临时对象构造到要复制或移动到的目标中,绕过复制或移动构造函数/析构函数对。

标准允许在以下情况下进行复制省略:

  • 返回语句:与函数返回类型具有相同cv非限定类型的非易失性自动对象可以直接构造到返回值中。
  • 抛出表达式:范围不超出最内层封闭 try 块的非易失性自动对象可以直接构造到异常对象中。
  • 临时对象:未绑定到引用的可以直接构造为具有相同 cv-unqualified 类型的对象。
  • 异常处理程序: 异常处理程序的异常声明可以被视为异常的别名对象,省略复制或移动操作。

在给定的示例中,当用 X("test") 实例化 z 时,会发生复制省略,因为它被视为尚未绑定的临时对象一个参考。因此,它被直接构造到 z 中,绕过移动构造函数并使用默认构造函数构造 z。

显式调用 move(X("test")) 可防止复制省略并强制使用移动构造函数,如修改后的输出所示。

以上是为什么在用另一个对象实例化一个对象时不调用 C 11 移动构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

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