所以我理解s2
绑定到表达式s1 + s1
,但是在s2
被分配的时候进行评估,或者在调用s2 += "Test";
时进行评估?还s2
会为临时字符串保留内存吗?
#include <iostream>
#include <string>
int main()
{
std::string s1 = "Test";
std::string&& s2 = s1 + s1;
s2 += "Test";
std::cout << s2 << '\n';
}
答案 0 :(得分:16)
s2
绑定到表达式s1 + s1
,但是在s2
被分配时进行评估
是
并且
s2
还会为临时字符串保留内存吗?
准确地说,s2
绑定到临时std::string
。
s1 + s1
将生成一个临时std::string
,它将绑定到引用s2
(其生命周期延长到引用的生命周期)。然后s2 += "Test";
,在operator+=()
上执行s2
,即临时std::string
。
答案 1 :(得分:2)
表达式始终在程序到达时进行评估。表达式的结果始终是值(或void)。
值有一个类型,而表达式有一个值类别,它结合起来选择在任何特定用途使用过载集的哪个重载。
在您的情况下,string operator+(...)
会产生一个字符串值,其类别为pr值(这是一种rvalue类型)。然后它立即被绑定到一个字符串&amp;&amp;,所以它的生命周期延长到参考的生命周期。
如果您已将其分配给普通字符串,则会选择string& string::operator=(string&&)
而不是该运算符的任何其他重载。请注意,由于c ++ 11允许编译器(并且需要c ++ 17)直接在目标对象内实现该值。此过程称为复制/移动省略或(N)RVO,用于(命名)返回值优化。