什么时候计算右值?
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 价值优化。
所以我知道 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 expressions1 + s1
, but is this evaluated at the times2
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 价值优化。