3

我有代码,它给了我一个编译错误。我期望左右运算符顺序评估。'name += ":"' 的结果是字符串,但看起来它首先评估了 ":" + "O"。我没有找到任何明确的解释为什么。

#include <string>

int main()
{
  std::string name("HELL");
  name += ":" + "O";
  std::cout << "Hello, " << name << "!\n";
}
4

3 回答 3

6

表达式name += ":" + "O"分组name += (":" + "O")

但这将导致编译错误,因为":""0"const char[2]衰减到const char*该表达式中的指针的类型;和指针不能相加!

从 C++14 开始,您可以使用user-defined-literal+将其放入“字符串模式” : ""s

name += ""s + ":" + "O"

分组规则是硬连线到语言语法中的,尽管从运算符优先级和关联性的角度来考虑很方便。

于 2019-12-04T10:10:01.573 回答
3

根据运算符优先级operator+优先级高于operator+=,则name += ":" + "O";解释为name += (":" + "O");,而":" + "O"无效,则不能添加两个指针(":""O"衰减为 type 的指针const char*)。

您可以添加()以指定优先级,例如(name += ":") + "O";,它可以编译,但请注意该部分+ "O"在此处变得毫无意义。或者您可能想要@Scheff(name += ":") += "O";建议的那样,这取决于您的需求。

于 2019-12-04T10:10:51.463 回答
0

此表达式语句带有复合赋值

name += ":" + "O";

实际上等价于

name = name + ( ":" + "O" );

在这个子表达式中

( ":" + "O" )

字符串文字被转换为指向它们的第一个元素的指针。但是,二元运算符 + 没有为指针定义。所以编译器发出错误。

您可以将原始语句拆分为两个语句,例如

name += ":";

name += "O";

在这种情况下,将使用为 std::basic_string 类定义的运算符 + 接受类型的参数const char *

于 2019-12-04T10:17:07.207 回答