I don't think introducing more syntax to the language for a feature that ultimately is a library solution, is a sustainable way to go.
But if you really need a compact notation for smart pointers, you'll get pretty close by using template aliases, e.g.
template <typename T> using up = std::unique_ptr<T>;
template <typename T> using sp = std::shared_ptr<T>;
// ...
up<int> foo(sp<int> bar) {
return bar ? up<int>(new int(*bar)) : nullptr;
}