一元正号+不是冗余语法,它在c++中具有明确的类型转换作用:可将数组、函数名、lambda等非指针类型隐式转为对应指针类型,常用于模板元编程和sfinae探测。

一元正号 + 不是冗余语法,它有明确的类型转换作用
很多人看到 +x 就觉得是“多此一举”,尤其对整数或浮点数——确实,+5 和 5 行为一致。但它真正的价值在类型系统里:当表达式需要一个指针类型,而你手头是个数组、函数名或 lambda,+ 是最轻量、最直接的隐式转指针手段。
比如:
int arr[3] = {1,2,3};
void func() {}
auto lambda = [](){};
<p>// 这些都不是指针类型,但能被 + 转成指针
int<em> p1 = +arr; // OK: 数组名 → int</em>
void (<em>p2)() = +func; // OK: 函数名 → 函数指针
void (</em>p3)() = +lambda;// OK: 可调用对象 → 函数指针(C++17 起)</p>
不加 + 就会编译失败,因为数组名/函数名/lambda 本身不是指针类型,不能直接赋给指针变量(除非显式取地址或强制转型)。
+ 在模板和 SFINAE 中常用于触发重载解析
当你写泛型代码,想探测某个类型是否支持指针转换(比如是否是函数对象或数组),+ 是比 & 更安全的选择:它不取地址,不产生左值引用,也不要求对象可寻址(比如临时 lambda 就不可取地址,但 +lambda 合法)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
-
&x要求x是左值且可寻址;+x对右值也有效 -
decltype(+x)可用于std::declval场景,避免构造实参 - 某些 traits 检测(如
is_function_pointer_v<decltype></decltype>)依赖它触发内置重载
别把 + 当数学运算,它和 - 的语义不对称
- 对算术类型有数学意义(取负),对指针非法(除非 C++20 的 operator- 重载);而 + 对算术类型只是“原样返回提升后副本”,对指针/数组/函数/lambda 却有明确的转换语义。
常见误解:
-
+true结果是true(不是1),因为bool提升后仍是bool,不是整数 -
+nullptr是合法的,结果还是nullptr(nullptr_t可隐式转为任意指针类型) -
+42和42在大多数上下文等价,但decltype(+42)是int,和decltype(42)一样——它不改变类型,只确保参与表达式时走指针重载路径
实际项目里什么时候该用 +?
日常写业务逻辑几乎用不到,但它在底层库、编译期元编程、类型探测宏中高频出现。如果你在阅读 std::function 实现、Boost.Hana 或某个现代 traits 库的源码,看到 +x,基本就是在做“安静地诱导指针转换”这件事。
记住一点:它不是为了人读得顺,而是为了让编译器在重载决议中选中那个 T* operator+(T*) 内置候选函数——这个细节容易被忽略,但恰恰是 C++ 类型系统精密之处。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










