Of the 3 options below, the third seems best to me:
SomeReallyLongTypeName* x = foo(); // old-school auto x = foo(); // c++11 pointer x = foo(); // c++17 concepts
smart_ptr<auto> x = foo();
Of the 3 options below, the third seems best to me: