C++23 让 std::move 更少见
Move in C++ without a 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。
HN 评论区
47- tom_
如果作者在看:这两个复杂的例子其实是一样的。
- fluoridation
不幸的是,我认为要想获得正确和/或高性能的行为,是无法绕过理解值语义这一关的。
- vivzkestrel
- 问个蠢问题,既然我们在聊 C++,我已经读完了 learncpp.com
- 我该怎么从零基础进阶到能开发 PlayStation 3 模拟器的人?
- 说真的,你们推荐哪些循序渐进的项目或学习经历,能让人真正精通 C++?
- hn45e7pbij
关于 move,我得稍微反驳一下——在小规模场景下,我的经验恰恰相反。
- sprocketz
是什么让 NVRO 的实现变得如此困难?为什么不能像 RVO 那样强制规定呢?
编译器是不是真的只是对直接构造的简单返回语句做了特殊处理?