一元加(+)对文字字符串

Ale*_*lke 13 c++ string-literals unary-operator

今天我写了一个表达式:

"<" + message_id + "@" +  + ">"
                          ^
                          |
                          \____  see that extra '+' here!
Run Code Online (Sandbox Code Playgroud)

并且对它实际编译感到惊讶.(PS message_id是一个QString,它也适用于std :: string)

我经常做这样的事情,在我工作的时候遗漏一个变量,我希望编译器能告诉我在哪里我仍然缺少条目.决赛看起来像这样:

"<" + message_id + "@" + network_domain + ">"
Run Code Online (Sandbox Code Playgroud)

现在我想知道为什么+一元运算符对字符串文字有效!?

Che*_*Alf 9

一元+可以应用于算术类型值,未范围的枚举值和指针值,因为......

C++标准在C++11§5.3.1/ 7中以这种方式定义它.

在这种情况下,字符串文字(其类型为array char const)衰减到指针char const.

当人们对某些东西的功能感到奇怪时,查看文档总是一个好主意.


"一元运算+符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值.对整数或枚举操作数执行整体提升.结果的类型是提升的操作数的类型."

  • @Rapptz:C++遵循"最大munch"规则,只要lexer有一个有效的令牌,它就会扫描.两个`+`实例之间的*space*导致词法分析器将它们视为两个单独的标记.因此它们不能构成一个`++`运算符(并且OP明显意识到这一点,询问一元`+'他已经识别出它,并且只想知道为什么它可以应用于文字字符串). (2认同)
  • 你的答案没有解释(对我个人而言),我不想给出一个完整的答案.原因是编译是因为`"<"+ message_id +"@"`会导致`<test @`是`message_id`是`test`.然后你留下`message_id + +">"`,这意味着``>"`(``const char [2]`类型衰变为`const char*`意味着你留下了`message_id +">"`用`">"`作为`const char*`.如果没有`message_id`,表达式就无法工作.这就是我想知道的全部内容. (2认同)
  • 我想知道在指针上允许一元"+"的基本原理是什么.它不在C中,但它在C++ 98中. (2认同)