C++ 运算符顺序评估

C++ operator order evaluation

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

#include <string>

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

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

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

从 C++14 开始,您可以使用 user-defined-literal ""s:[= 将 + 放入 "string mode" 20=]

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

分组规则是固定在语言 语法 中的,尽管用 operator precedence and associativity.

来思考很方便

根据operator precedenceoperator+的优先级高于operator+=,那么name += ":" + "O";被解释为name += (":" + "O");,而":" + "O"是无效,您不能添加两个指针(":""O" 会衰减为类型为 const char* 的指针)。

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

这个复合赋值的表达式语句

name += ":" + "O";

实际上等同于

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

在这个子表达式中

( ":" + "O" )

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

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

name += ":";

name += "O";

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

的参数