为什么 std::Move 可以在常量对象上使用
通常,在常量对象上调用 std::move 似乎不合逻辑,因为人们期望移动或修改该物体。然而,在 C 11 中,允许在常量对象上使用 std::move。
详细说明,std::move(cat) 并不意味着该对象实际上已移动。相反,它指示编译器尝试移动。如果类没有定义接受对右值的 const 引用的构造函数(例如 const Cat&&),编译器将使用对左值复制构造函数的隐式 const 引用,从而执行安全复制。
考虑以下示例:
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); }
即使使用了 std::move,也会输出“COPY”消息,表明对象被复制而不是移动。
此行为充当安全机制。如果禁用复制构造函数,编译器会向开发人员提示错误消息。
此外,Scott Meyers 的《Effective Modern C》一书中提到的 bug 不是稳定性问题,而是性能问题。当打算移动时执行隐式复制时会发生这种情况,从而导致执行速度变慢。此外,即使对于缺少移动构造函数的非常量对象,也可能会出现此类错误。
最终,允许 std::move 对常量对象进行操作提供了灵活性。如果需要,开发人员保留从 const 右值引用显式构造对象的能力。
以上是为什么可以在 C 中的常量对象上使用 `std::move` ?的详细内容。更多信息请关注PHP中文网其他相关文章!