提供的代码演示了在 Func 函数中修改内置类型整数 num 的意外行为,甚至尽管它是使用 std::move 作为右值引用传递的。这种行为与 std::move 转移所有权和资源的普遍理解相矛盾。
移动语义是指将所有权和资源从一个对象转移到另一个对象。在这种情况下,资源是属于对象的数据值或分配的内存。
内置类型,例如整数,本身代表它们的资源抓住。因此,转让其资源的所有权没有什么意义。相反,它们只是传递对对象的引用,允许修改反映在原始对象中。
std::move 实际上并不移动对象。其目的是将左值引用(对已定义位置的对象的引用)转换为 x 值引用(对已过期对象的引用)。此转换允许引用绑定到接收函数内的右值引用。
在内置类型对象上调用 std::move 后,引用传递函数仍然引用原始对象。对对象所做的任何修改都会反映在原始对象中。
与可以定义自定义移动语义的用户定义类型不同,内置类型没有此类行为。 std::move 不会调用内置类型的任何移动构造函数或赋值运算符。相反,它只是将它们转换为右值引用以用于绑定目的。此行为由 C 标准明确定义,并解释了给定代码示例中 num 的意外修改。
以上是为什么内置类型不表现出移动语义?的详细内容。更多信息请关注PHP中文网其他相关文章!