首页 > 后端开发 > C++ > 正文

你能从 C 中的 const 对象中移动吗?

Patricia Arquette
发布: 2024-11-18 09:49:02
原创
643 人浏览过

Can You Move From a Const Object in C  ?

理解 const 对象上的 std::move:揭示性能陷阱

在 C 中,std::move 函数用于转移对象的所有权。然而,出现了一个常见的问题:为什么可以在 const 对象上调用 std::move ?这不是违反直觉并且有潜在危险吗?

诀窍在于 std::move(const_object) 并不执行实际的移动。相反,它指示编译器尝试移动。如果类没有接受右值 const 引用的构造函数(移动构造函数),编译器将默认使用隐式复制构造函数。

考虑以下示例:

struct Cat {
   Cat(){}
   Cat(const Cat&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {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 对象进行操作似乎合乎逻辑,但实际上由于以下原因,这不是一个简单的解决方案:

  • 它不会阻止所有意外复制的情况,因为非常量对象仍然可能缺少移动构造函数。
  • 它会干扰有意使用后备复制构造函数的通用模板代码。
  • 它会限制可能有意需要从 const 对象移动构造函数的情况。

以上是你能从 C 中的 const 对象中移动吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板