Overloading operator ->* for smart pointers
Is there anything that could be improved in my code?


I think you can accomplish the same thing in much less code with just a lambda:

template &lt;class U&gt;
auto operator-&gt;*(U pmf) const {
    return [=](auto&amp;&amp;... args){
        return (ptr-&gt;*pmf)(std::forward&lt;decltype(args)&gt;(args)...);
    };
}


Could have a static_assert on std::is_member_pointer for extra safety.


  How to solve the second remaining problem listed at the section “Loose Ends” of Meyer’s article?


I believe the lambda solves this problem as well. 



Also you could consider const propagation. If the Smart_pointer is const, do you really want to allow calling non-const member functions? I don't know. If you decide you don't, you should provde both a const and non-const overload and forward to a helper:

template &lt;class U&gt;
auto operator-&gt;*(U pmf) {
    return pending_mem_fun(ptr, pmf);
}

template &lt;class U&gt;
auto operator-&gt;*(U pmf) const {
    return pending_mem_fun(const_cast&lt;T const*&gt;(ptr), pmf);
}


where pending_mem_fun doesn't actually have to be a member function.