Giochicchiando un po' con gli smart pointers mi sono imbattuto nel codice sottostante che mi ha sorpreso non poco.
codice:
#include <iostream>
#include <memory>
#include <utility>
using namespace std;
struct Foo
{
~Foo() { cout << "~Foo()\n"; }
void f() const { cout << "Foo:f()\n"; }
};
int main()
{
unique_ptr< Foo > un{ new Foo() };
{
shared_ptr< Foo> sh = move(un);
sh->f();
}
if(!un)
cout << "un is empty\n";
un->f();
return 0;
}
Questo codice produce come output:
codice:
Foo:f()
~Foo()
un is empty
Foo:f()
Ma mi aspettavo almeno UB. Qualcuno saprebbe darmi una spiegazione?