C++23 让 std::move 更少见

Move in C++ without a std:move

C++23 让 std::move 更少见

我在之前的文章中曾建议尽量少用 std::move,而今天我想展示这一建议带来的好处:默认获得最佳性能。C++17 引入了保证的拷贝省略(copy elision),让返回值优化(RVO)和命名返回值优化(NRVO)能避免不必要的拷贝或移动。在 C++11 到 C++19 期间,某些涉及右值引用的场景仍需手动使用 std::move 才能触发移动语义,这违背了我的建议。但到了 C++23,编译器在这些情况下会自动进行隐式移动,无需再显式调用 std::move。这意味着你可以更安心地遵循“少用 std::move”的原则,同时依然获得最优性能。

一旦你将编译器切换到 C++23 模式,这两种情况都会执行隐式移动,无需 std::move。
  1. tom_

    如果作者在看:这两个复杂的例子其实是一样的。

  2. fluoridation

    不幸的是,我认为要想获得正确和/或高性能的行为,是无法绕过理解值语义这一关的。

  3. vivzkestrel

    - 问个蠢问题,既然我们在聊 C++,我已经读完了 learncpp.com

    - 我该怎么从零基础进阶到能开发 PlayStation 3 模拟器的人?

    - 说真的,你们推荐哪些循序渐进的项目或学习经历,能让人真正精通 C++?

  4. hn45e7pbij

    关于 move,我得稍微反驳一下——在小规模场景下,我的经验恰恰相反。

  5. sprocketz

    是什么让 NVRO 的实现变得如此困难?为什么不能像 RVO 那样强制规定呢?

    编译器是不是真的只是对直接构造的简单返回语句做了特殊处理?

同日更多故事

2026-09-02