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" 之前。
下面的代码给出了以下输出:
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" 之前。