Perché std :: shared_ptr funziona

Ho trovato del codice usando std :: shared_ptr per eseguire una pulizia arbitraria all’arresto. All’inizio ho pensato che questo codice non potesse funzionare, ma poi ho provato quanto segue:

#include  #include  #include  class test { public: test() { std::cout << "Test created" << std::endl; } ~test() { std::cout << "Test destroyed" << std::endl; } }; int main() { std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr>" << std::endl; std::vector<std::shared_ptr> v; { std::cout << "Creating test" << std::endl; v.push_back( std::shared_ptr( new test() ) ); std::cout << "Leaving scope" << std::endl; } std::cout << "Leaving main" << std::endl; return 0; } 

Questo programma fornisce l’output:

 At begin of main. creating std::vector<std::shared_ptr> Creating test Test created Leaving scope Leaving main Test destroyed 

Ho alcune idee sul perché questo potrebbe funzionare, che ha a che fare con la parte interna di std :: shared_ptrs come implementata per G ++. Poiché questi oggetti racchiudono il puntatore interno insieme al contatore, il cast da std::shared_ptr a std::shared_ptr probabilmente non ostacola la chiamata del distruttore. Questa supposizione è corretta?

E naturalmente la domanda molto più importante: è garantito che funzioni secondo lo standard, o potrebbe ulteriori modifiche agli interni di std :: shared_ptr, altre implementazioni in realtà infrangono questo codice?