我的代码中出现复制/粘贴错误,并以如下所示的一行结尾:myString = otherString; + "?" + anotherString;
第一个分号后的代码未发出任何错误或警告。使用online compiler仔细检查我的环境,我创建了这个快速示例,该示例也可以编译并运行:
int main()
{
std::string sText("Hello World");
std::string sMore(" again");
+ "???" + sText + sMore; //No warning, no error
cout << sText; //output "Hello World" as expected
+ 4; //Warning has no effect
+ sMore; //error: no match for ‘operator+’ (operand type is ‘std::string {aka std::basic_string}’)
return 0;
}
那么开始+在做什么?
文字字符串(例如"???"
)实际上是字符数组。像所有其他数组一样,它们衰减到指向自己的指针。这就是这里发生的情况,表达式+ "???"
将一元+
运算符应用于指向字符串第一个元素的指针。
这将导致另一个指向字符的指针(指向一个字符),然后可以将其用于添加到std::string
对象。
对于其他文字,例如数字,也会发生同样的事情,这就是+4
也有效的原因。
但是没有为+
定义一元std::string
运算符,这就是为什么会出现+sMore
错误的原因。
首先,字符串文字是字符数组。当您将数组作为操作数传递给一元运算符+时,该数组将隐式转换为指向第一个元素(类型为const char
)的指针。这种隐式转换称为衰减。