在 C 中,std::move 函数用于转移对象的所有权。然而,出现了一个常见的问题:为什么可以在 const 对象上调用 std::move ?这不是违反直觉并且有潜在危险吗?
诀窍在于 std::move(const_object) 并不执行实际的移动。相反,它指示编译器尝试移动。如果类没有接受右值 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); // prints "COPY" }
如您所见,即使 cat 是一个 const 对象,编译器也会安全地将 cat2 构造为副本。这是因为在此示例中没有可用于 const 对象的移动构造函数。
Scott Meyers 在《Effective Modern C》中强调的潜在陷阱是性能问题而不是稳定性问题。本质上,当移动构造函数不可用时尝试从 const 对象移动将导致复制效率降低。
虽然限制 std::move 对 const 对象进行操作似乎合乎逻辑,但实际上由于以下原因,这不是一个简单的解决方案:
以上是你能从 C 中的 const 对象中移动吗?的详细内容。更多信息请关注PHP中文网其他相关文章!