C++11构造函数和析构函数顺序

C++11 constructor & destructor order

下面的代码给出了以下输出:

Constructing stream s1
Destructing stream s1
Output1
Test
Constructing stream s2
Destructing stream s2
Test

#include <iostream>
#include <utility>
#include <memory>
#include <string>

using std::cout;

class Stream {
public:
    Stream(const std::string &name) : s(name) {
        cout << "Constructing stream " << name <<  std::endl;
    }

    virtual ~Stream(){
        cout << "Destructing stream " << s << std::endl;
    }

    friend Stream &&operator<<(Stream &&rhs, const std::string &str) {
        cout << str << std::endl;
        return std::move(rhs);
    }

    std::string s;
};

Stream &&getStream(const std::string &name){
    Stream stream(name);
    return std::move(stream);
}

int main(int argc, const char **argv) {
    getStream("s1") << "Output1" << "Test";
    getStream("s2") << "Test";
}

我对输出的期望是这样的:

Constructing stream s1
Output1
Test
Destructing stream s1
Constructing stream s2
Test
Destructing stream s2

为什么在 << 运算符调用之前调用析构函数?

正如 Kerrek 正确指出的那样,原因是这个函数:

Stream &&getStream(const std::string &name){
    Stream stream(name);
    return std::move(stream);
}

这里你创建一个"Stream"类型的对象作为本地变量"stream"。当函数returns时,变量"stream"被析构。这显然发生在打印 "Output1" 之前。