使用隐式移动规则按值返回类对象
当从函数按值返回类的对象时,隐式移动规则规则开始发挥作用。此规则确定使用哪个构造函数来初始化返回的对象。通常,如果对象被视为 xvalue(可以从中移动的表达式),则首选移动构造函数。
在 示例 1 中,我在 Some_thing() 中声明的变量函数是 xvalue,因为它是在局部作用域中声明的,并且被认为是符合移动条件的。因此,将调用移动构造函数 test(test&& s),如输出所示。
但是,在 示例 2 中,您删除了移动构造函数并将复制构造函数修改为 test (测试&z)。此更改导致输出显示对复制构造函数 test(test& z) 的调用,而不是移动构造函数,这是由于隐式移动规则而预期的。
出现这种看似矛盾的行为是因为 i 仍被视为xvalue,但编译器现在也认为“常规”复制构造函数是可行的。隐式移动规则首先尝试使用移动构造函数,但由于没有移动构造函数,因此它继续使用复制构造函数。
要显式强制使用移动构造函数,您可以删除复制构造函数,如示例3所示。这可以防止编译器将复制构造函数视为一个选项,并且即使将移动构造函数标记为 const(通常会阻止移动),也会使用移动构造函数。
示例 4 演示了如果移动构造函数可用并且移动操作为 noexcept,则仍可以移动 const 对象。在这种情况下,u 初始化期间创建的临时对象被移动到 r,从而导致调用移动构造函数。
以上是当移动构造函数不可用时,为什么隐式移动规则更喜欢复制构造函数而不是移动构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!