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?