我有代码,它给了我一个编译错误。我期望左右运算符顺序评估。'name += ":"' 的结果是字符串,但看起来它首先评估了 ":" + "O"。我没有找到任何明确的解释为什么。
#include <string>
int main()
{
std::string name("HELL");
name += ":" + "O";
std::cout << "Hello, " << name << "!\n";
}
我有代码,它给了我一个编译错误。我期望左右运算符顺序评估。'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
name += ""s + ":" + "O"
分组规则是硬连线到语言语法中的,尽管从运算符优先级和关联性的角度来考虑很方便。
此表达式语句带有复合赋值
name += ":" + "O";
实际上等价于
name = name + ( ":" + "O" );
在这个子表达式中
( ":" + "O" )
字符串文字被转换为指向它们的第一个元素的指针。但是,二元运算符 + 没有为指针定义。所以编译器发出错误。
您可以将原始语句拆分为两个语句,例如
name += ":";
和
name += "O";
在这种情况下,将使用为 std::basic_string 类定义的运算符 + 接受类型的参数const char *。