:
template<typename T>
my_class(typename std::enable_if<std::is_base_of<implementation, derived_1>::value, T&&>::type impl) : impl_(std::make_shared<T>(std::move(impl))) {}
template <typename T>
my_class& operator= (typename std::enable_if<std::is_rvalue_reference<T&&>::value && !std::is_same<T, my_class>::value, T&&>::type impl)
, T . , T, , , Anything<T>::type.
, enable_if , :
template <class T>
typename enable_if<..., T&>::type operator=(const T&);
( ) , :
template <class T>
MyClass(const T&, typename enable_if<..., void>::type* =0);
FredOverflow .
, rvalue-, std::forward std::move. . . ( FredOverflow):
template <typename T>
typename std::enable_if<std::is_base_of<implementation, T>::value, my_class&>::type
operator=(T&& impl)
{
std::make_shared<implementation>(std::forward<T>(impl)).swap(impl_);
return *this;
}