什么时候计算右值?

When is an rvalue evaluated?

所以我知道 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';
}

s2 binds to the expression s1 + s1, but is this evaluated at the time s2 is assigned

是的。

And also would s2 hold memory for a temporary string?

准确地说,s2 绑定到一个临时的 std::string

s1 + s1 将产生一个临时的 std::string,它将绑定到引用 s2(并且它的生命周期延长到引用的生命周期)。然后s2 += "Test";,对s2执行operator+=(),即临时的std::string.

表达式总是在程序到达它们的地方计算。表达式的结果始终是一个值(或 void)。

值有一个类型,表达式有一个值类别,在任何特定用途中,它们结合起来选择使用重载集中的哪个重载。

在您的例子中,string operator+(...) 产生一个字符串值,类别为 pr-value(一种右值)。然后它立即绑定到一个字符串&&,因此它的生命周期延长到引用的生命周期。

如果您改为将其分配给纯字符串,则会选择 string& string::operator=(string&&) 而不是该运算符的任何其他重载。请注意,从 c++11 开始,允许编译器(并且从 c++17 起要求)直接在目标对象内部具体化值。此过程称为 copy/move 省略或 (N)RVO,用于(命名)Return 价值优化。