Как лист понимает когда его заполняют динамически выделенными объектами и и объектами из стека?
Есть тестовый код. Тут я проверял как работает лист.
#include <list>
using namespace std;
class MyClass{
public:
MyClass(string && str){
cout<<str<<" MyClass created\n";
this->str = str;
}
void PrintString(){
cout<<str<<endl;
}
~MyClass(){
cout<<str<<" is destroyed!\n";
}
protected:
string str;
};
list<MyClass> l = list<MyClass>();
void F(string && str){
MyClass m = MyClass(str.c_str());
l.push_back(*new MyClass("dynamic in func"));
l.push_back(m);
}
int main(int size, char** params)
{
try{
F("local in func");
l.push_back(*new MyClass("dynamic"));
}
catch(exception ex){
}
}
Вот что получается на выходе
local in func MyClass created
dynamic in func MyClass created
local in func is destroyed!
dynamic MyClass created
dynamic in func is destroyed!
local in func is destroyed!
dynamic is destroyed!
Как я понял, когда я создаю объект типа MyClass в стеке, лист это понимает и создаёт копию, а когда я создаю тот же объект в куче, то он копии не делает, просто сохраняя указатель, при том в обоих случаях используя одну и ту же перегрузку метода
list.push_back(const MyClass & __x)
Как он это делает?