下面的表达式是否会创建另一个std :: string,然后将其添加到s1?
std::string s1 = "abc", s2 = "xyz";
s1 += s2 + 'b';
它是否应该阻止这种情况(如果没有额外的工作,它们会被添加到s1中)?
std::string s1 = "abc", s2 = "xyz";
s1 += s2;
s1 += 'b';
这些规则是否也适用于“std :: string + std :: string”表达式?
答案 0 :(得分:4)
涉及+
的所有重载std::string
运算符都会返回一个新的std::string
对象。这是you finally decipher the relevant documentation时您将获得的不可避免的结论。
因此,在您的问题的第一个示例中,+
运算符将返回一个临时对象,该对象将在完成紧随其后的+=
操作时被销毁。
话虽如此:允许C ++编译器使用任何产生相同可观察结果的优化。 C ++编译器可能会发现,通过将代码的第一个版本转换为第二个版本,可以避免创建临时对象的可能性。我不太认为这很可能,但这是可能的。两个版本的代码之间的结果没有可观察到的差异,因此优化是公平的游戏。
但是,从技术上讲,+
操作会产生一个临时的std::string
对象。
答案 1 :(得分:0)
取决于具体情况。在您的代码段中没有其他对象,s2
和'b'
将附加到已存在的s1
。
http://www.cplusplus.com/reference/string/string/operator+=/
例如在这种情况下:
std::string s1 = "abc";
std::string s2 = "zxy";
std::string result = s1 + s2;
result
是连接s1
和s2