我有下面的代码,它给出了以下输出:
构建流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;之前调用析构函数?操作员电话?
答案 0 :(得分:3)
正如Kerrek正确指出的那样,原因是这个功能:
Stream &&getStream(const std::string &name){
Stream stream(name);
return std::move(stream);
}
在这里,您可以创建一个“Stream”类型的对象作为 local 变量“stream”。当函数返回时,变量“stream”被破坏。这显然是在打印“Output1”之前发生的。