对字面字符串使用一元加号(+)

15

今天我写了一个表达式:

"<" + message_id + "@" +  + ">"
                          ^
                          |
                          \____  see that extra '+' here!

我很惊讶它竟然编译通过了。(PS:message_id是一个QString,如果换成std::string也可以)

我经常这样做,当我在工作时漏掉一个变量,我期待编译器能告诉我哪些地方还需要输入。最终代码看起来会像这样:

"<" + message_id + "@" + network_domain + ">"

现在我想知道为什么针对字符串字面量,+一元运算符是有效的!?


1
消息 ID 是什么类型? - klm123
1
指针算术运算可能。 - Rapptz
@klm123,我更新了问题。 - Alexis Wilke
1个回答

10

一元运算符+可以用于算术类型值、无作用域枚举值和指针值,因为...

这是由C++标准规定的,具体可以参考C++11 §5.3.1/7。

在这种情况下,字符串字面量是char const数组类型,将会衰减(decay)成指向char const类型的指针。

当对某个功能的功能产生疑问时,查看文档总是一个好主意。


一元+运算符的操作数必须是算术类型、无作用域枚举或指针类型,结果是参数的值。整数提升适用于整数或枚举操作数。结果的类型是被提升的操作数的类型。


1
请问您能引用C++11 §5.3.1/7这部分内容吗? - klm123
2
@Rapptz:C++遵循“最大匹配”规则,其中词法分析器扫描所有有效标记。两个+之间的空格使词法分析器将它们视为两个单独的标记。因此,它们不能构成一个++运算符(显然OP已经意识到这一点,询问一元+,他已经确定了它是这样的,并且只想知道为什么它可以应用于文字字符串)。 - Cheers and hth. - Alf
2
你的回答对我来说并没有解释清楚,而且我也不想给出一个完整的答案。原因是如果 message_idtest,那么 "<" + message_id + "@" 将会得到 <test@。然后你就剩下了 message_id + + ">",这意味着 ">"(它的类型是 const char[2])会衰减为 const char*,这意味着你剩下了 message_id + ">"">" 作为 const char*。如果没有 message_id,这个表达式是行不通的。这就是我想知道的全部内容。 - Rapptz
2
我想知道允许指针使用一元+的原因是什么。在C语言中没有这个操作,但在C++98中有。 - AnT stands with Russia
1
@MichaelBurr 它们并不完全等价。其中一个允许调用以数组引用为参数的operator+,而另一个却不行,因为一元运算符 + 已经强制进行了从数组到指针的转换。 - user743382
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接