我使用相同的方法进行字符串连接,但第一个显示错误,第二个显示结果



此代码显示错误。

#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
s="b"+"k"+"4";
cout<<s<<endl;
return 0; 
}

此代码工作正常。

#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
string s1 = "a";
s=s1+"b"+"k"+"4";
cout<<s<<endl;
return 0; 
}

我不知道为什么会发生这种情况,在这两种情况下我都使用字符串?

s="b"+"k"+"4";

您的文本字符串将衰减为指针,您将这些指针相加,并将结果分配给s。指针添加将毫无意义,没有重载的+运算符函数需要两个const char *参数。

但是随着

s=s1+"b"+"k"+"4";

您从一个std::string对象开始,该对象有重载的+运算符函数,这些函数返回一个std::string对象。简而言之,它类似于

s=((s1+"b")+"k")+"4";

也就是说,你有s1 + "b",它返回一个临时std::string,然后你向其添加"k",它返回一个临时std::string,你向其添加"4",返回一个分配给s的临时std::string。或者显式使用临时对象和函数调用:

std::string t1 = operator+(s1, "b");
std::string t2 = operator+(t1, "k");
std::string t3 = operator+(t2, "4");
s = t3;

接受的答案是完全正确的,但我只是认为显示表达中毒可能很有用。

该技术通常被称为"感染"或"中毒"表达。广泛使用这一点的表达式库是 boost yap。这个想法是用"弦性"感染"最左边的表达(请原谅我的法语)。一个例子

#include <iostream>
#include <string>
int main(int, char**){
auto s = std::string("a") + "b" + "c";
std::cout << "s = " << s << 'n';
return 0;
}

使最左边的表达式成为字符串会感染整个表达式,迫使编译器查找 std::string operator+,该运算符会找到 char* 的右手表达式,这正是我们想要的运算符。

最新更新