何时评估了右值?

时间:2017-06-01 04:15:08

标签: c++ c++11 rvalue-reference temporary rvalue

所以我理解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';
}

2 个答案:

答案 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,用于(命名)返回值优化。