Mas*_*Man 28 c++ operators unary-operator
一元运算+符是否仅包含与一元运算-符对称,还是在C++代码中找到了一些实际用途?
在这里搜索,我遇到了C中一元'+'运算符的目的是什么?,但唯一有用的场景涉及预处理器宏.这些都是很好的,但它们似乎是一些不常见的情况,并涉及宏.是否有涉及更常见的C++代码的用例?
Pet*_*ker 31
char ch = 'a';
std::cout << ch << '\n';
std::cout << +ch << '\n';
Run Code Online (Sandbox Code Playgroud)
第一个插入写入字符a来cout.第二个插入写入chto 的数值cout.但这有点模糊; 它依赖于编译器为+运营商应用整体促销.
Kei*_*son 21
与一元对称-并非完全无用; 它可以用于强调:
const int foo = -1;
const int bar = +1;
Run Code Online (Sandbox Code Playgroud)
并且可以使用重载的一元+来表示与其操作数产生相同逻辑值的操作,同时执行一些非平凡的计算.(我已经看到这对Ada中的类型转换已经完成了,它允许一元+,但不允许转换.)我没有一个好的C++示例,有人可能会认为这将是糟糕的风格.(然后,我看到很多关于超载的咆哮<<.)
至于为什么 C++有它,它可能主要是为了与C的一致性,它增加了1989 ANSI标准.在C原理只是说:
C89委员会从几个实施中采用了一元加,用于对称与一元减.
Arn*_*rtz 10
如果你明确地忽略了一个类的任何数值语义,那么任何运算符重载都是明确的,不要"按照这样做".在这种情况下,一元加上可能有任何意义,做的不仅仅是返回*this
突出的例子:Boost.Spirit为嵌入式EBNF的Kleene Plus 一元加上生成一个解析器规则,让它的参数(解析器规则)匹配一次或多次.
一元运算+符将左值转换为右值:
struct A {
static const int value = 1;
};
// ...
int x = std::min(0, A::value);
Run Code Online (Sandbox Code Playgroud)
哦不!此代码不会链接,因为有人忘记定义(以及声明)A::value。 std::min通过引用获取其参数,因此A::value必须有一个地址,以便引用可以绑定到它(从技术上讲,一个定义规则说它必须在程序中只定义一次。)
没关系,一元加上救援:
int x = std::min(0, +A::value);
Run Code Online (Sandbox Code Playgroud)
一元加号创建一个具有相同值的临时对象,并且引用绑定到临时对象,因此我们可以解决缺少的定义。
这不是您经常需要的东西,但它是一元加运算符的实际用途。