C++23 中不存在 std::forward_like,它从未被纳入标准草案,也未被任何主流编译器实现;正确做法是组合使用 std::forward、std::move 和 static_cast 等已有工具。

std::forward_like 在 C++23 中并不存在 —— 这是个常见误解。C++23 标准里没有 std::forward_like,也没有任何名为该名称的函数模板或工具。
为什么搜不到 std::forward_like?
它从未被纳入 ISO C++23 标准草案(N4910 及最终发布版)。网上出现的所谓“std::forward_like”多源于早期提案(如 P2554R0)的讨论稿,但该提案最终被撤回,未进入 C++23。编译器(GCC 13/Clang 16/MSVC 19.35+)均未实现该符号,链接或编译时会报 error: 'forward_like' is not a member of 'std'。
你真正需要的是 std::forward + 类型萃取
若目标是“把一个对象以原始值类别(lvalue/rvalue)和原始 cv/ref-qualified 类型转发给另一个函数”,标准做法仍是组合使用 std::forward 和显式类型推导:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 对万能引用参数
T&& t,用std::forward<t>(t)</t>—— 这已能完美保留值类别 - 若需“模仿某类型
U的引用限定”,比如想让t表现得像U&&或const U&,需手动构造:template<typename U, typename T> auto forward_as(T&& t) { if constexpr (std::is_rvalue_reference_v<U&&>) { return std::move(t); // 模拟 U&& } else { return static_cast<U&&>(t); // 模拟 U& } } - 注意:
std::forward本身不“感知”目标类型 U 的 cv/ref 限定;它只依赖模板参数T的推导结果
替代方案:P2554 提案的意图与现实落差
原提案想解决的典型场景是容器适配器中“转发元素时保持其原始 cv 和引用限定”,例如:
立即学习“C++免费学习笔记(深入)”;
- 从
const std::vector<T>&中取元素,希望转发为const T&而非T&& - 现有
std::forward<T>(x)无法直接表达“按U的引用类型转发”,必须靠static_cast<U&&>(x)或std::move/std::as_const组合 - 所有主流 STL 实现(libc++, libstdc++, MSVC STL)至今未添加该工具,也不计划在 C++26 前支持
真正写转发逻辑时,别找不存在的 std::forward_like —— 它不会帮你省掉类型判断,反而会让你卡在编译错误里。老老实实用 std::forward、std::move 和 static_cast,再辅以 std::remove_cvref_t 和 std::is_lvalue_reference 判断,才是可控且可移植的做法。

















