¿Cómo forzar solo una instancia de punteros inteligentes para una clase?

He estado trabajando en una forma de evitar que el usuario use una clase sin punteros inteligentes. Por lo tanto, obligándolos a que el puntero inteligente asigne y administre el objeto por montón. Para obtener tal resultado, he intentado lo siguiente:

#include <memory>
class A
{
private :
    ~A {}
    // To force use of A only with std::unique_ptr
    friend std::default_delete<A>;
};

Esto funciona bastante bien si solo quiere que sus usuarios de clase sean capaces de manipular la instancia de su clase a través destd::unique_ptr. Pero no funciona parastd::shared_ptr. Así que me gustaría saber si tuvo alguna idea para obtener tal comportamiento. La única solución que he encontrado es hacer lo siguiente (usarfriend std::allocator_traits<A>; era insuficiente):

#include <memory>
class A
{
private :
    ~A {}
    // For std::shared_ptr use with g++
    friend __gnu_cxx::new_allocator<A>;
};

Pero esta solución no es portátil. Tal vez lo estoy haciendo de la manera incorrecta.

Respuestas a la pregunta(2)

Su respuesta a la pregunta