我有代码,它给了我一个编译错误。 我期望左右操作员订单评估。 'name + =“:”'的结果是字符串,但是看起来它首先评估了“:” +“ O”。我没有找到清楚的解释。
#include <string>
int main()
{
std::string name("HELL");
name += ":" + "O";
std::cout << "Hello, " << name << "!\n";
}
答案 0 :(得分:6)
表达式name += ":" + "O"
被分组为name += (":" + "O")
但这会导致编译错误,因为":"
和"0"
是const char[2]
类型,它们会衰减为该表达式中的const char*
指针;指针不能相加!
在C ++ 14中,您可以使用用户定义的文字 +
将""s
置于“字符串模式”:
name += ""s + ":" + "O"
分组规则被硬连接到语言语法中,尽管用operator precedence and associativity来思考很方便。
答案 1 :(得分:3)
根据operator precedence,operator+
的优先级高于operator+=
,则name += ":" + "O";
被解释为name += (":" + "O");
,而":" + "O"
无效,您不能添加两个指针(":"
和"O"
会衰减为类型为const char*
的指针)。
您可以添加()
来指定优先级,例如(name += ":") + "O";
,它会编译,但请注意,部分+ "O"
在这里变得毫无意义。或者,您可能希望按照@Scheff的建议使用(name += ":") += "O";
,这取决于您的需求。
答案 2 :(得分:0)
此表达式语句具有复合赋值
name += ":" + "O";
实际上等同于
name = name + ( ":" + "O" );
在此子表达式中
( ":" + "O" )
字符串文字将转换为指向其第一个元素的指针。但是,没有为指针定义二进制运算符+。因此,编译器会发出错误消息。
您可以将原始语句分成两个语句,例如
name += ":";
和
name += "O";
在这种情况下,将使用为类std :: basic_string定义的运算符+,该类型接受类型为const char *
的参数。