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

时间:2015-12-11 23:57:48

标签: c++ c++11 constructor operator-overloading destructor

我有下面的代码,它给出了以下输出:

  

构建流s1
  破坏流s1
  输出1
  测试
  构建流s2   破坏流s2
  测试

#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";
}

我对输出的期望是:

  

构造流s1
输出1
测试
描述流s1
构造流s2
测试
描述流s2

为什么在&lt;&lt;之前调用析构函数?操作员电话?

1 个答案:

答案 0 :(得分:3)

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

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

在这里,您可以创建一个“Stream”类型的对象作为 local 变量“stream”。当函数返回时,变量“stream”被破坏。这显然是在打印“Output1”之前发生的。