Unary plus (+) against literal string
今天我写了一个表达:
1 2 3 4
| "<" + message_id +"@" + +">"
^
|
\____ see that extra '+' here! |
很惊讶它居然被编译了。(ps message_id是一个QString,它也可以与std::string一起工作)
我经常这样做,在工作时去掉一个变量,我希望编译器告诉我哪里仍然缺少条目。决赛将是这样的:
1
| "<" + message_id +"@" + network_domain +">" |
现在我想知道为什么+一元运算符对字符串文字有效!?
- 消息类型是什么?
- 可能是指针算术。
- @我更新了问题。
一元+可应用于算术类型值、非范围枚举值和指针值,因为…
C++标准是这样定义的,在C++ 11中5.3.1/7。
在这种情况下,类型为char const数组的字符串文字衰减为指向char const的指针。
当人们怀疑某个东西的功能时,查看文档总是一个好主意。
&ldquo;一元+运算符的操作数应具有算术、非运算范围的枚举或指针类型,并且结果是参数的值。整数提升是对整数或枚举操作数执行的。结果的类型是提升操作数的类型。
- 因此,表达式"<" + message_id +"@" + +">"与"<" + message_id +"@" +">"完全等价。
- @迈克尔:是的。
- 你能引用C++ 11和167,5.3.1/7吗?
- @是的,完成了。
- @事实上,我相信是"<" + message_id +"@"++">"。
- @拉普茨,你可以测试一下:)
- @Rapptz++不适用于文本字符串,加上最后一个">"将在表达式中生成错误。
- @亚历克西斯,你说得对。我不确定为什么+ +正在编译,这个答案真的不能回答它。
- @ Rapptz:C++遵循"最大蒙克"规则,只要有一个有效的令牌,Listar就会扫描。+的两个实例之间的空间使lexer将它们视为两个单独的令牌。因此,它们不能构成一个++操作符(而操作人员显然意识到这一点,在询问一元+时,他已经将其识别为一元+操作符,并且只想知道为什么它可以应用于文字字符串)。
- @Rapptz:alf引用的一句话,"一元+运算符的操作数应具有算术、无范围枚举或指针类型,结果是参数的值"。因此,+">"的表达可计算为">"。
- 你的回答(对我个人而言)无法解释,我也不想给出一个成熟的回答。之所以编译是因为"<" + message_id +"@"会导致是message_id是test。那么你就只剩下message_id + +">",这意味着">"(const char[2]型)衰变为const char*,这意味着你只剩下message_id +">"和">"作为const char*型。如果没有message_id,这个表达就不会起作用。我只想知道这些。
- 我想知道允许一元+指向指针的理由是什么。它不是在C中,而是在C++ 98中。
- @Rapptz:是的,message_id需要在其中,以便QString操作符重载适用于所有二进制+操作符。但问题是关于最后一个+运算符,而alf的回答解释了为什么这最终不是语法错误。
- AndreyT:我不知道,但如果它在任何地方,那么最有可能的地方是Bjarne的"设计和进化"的C++书籍。我没有,但杰里·科芬有。我相信(但不确定)你会在C++休息室找到他。如果我猜的话,我会说"为了统一的规则"。例如,当我问比亚恩关于允许引用const在任何地方绑定到rvalue的基本原理时,这就是答案。
- @迈克尔布尔,它们并不完全等同。一个允许调用一个以数组引用为参数的operator+,另一个则不允许,因为一元+已经强制数组到指针的转换。