Вы можете инициализировать общий указатель на const-объект из общего указателя на неконстантный объект.
#include <memory>
void foo ()
{
auto v = std::make_shared <int> (10);
std::shared_ptr <int const> x = v;
// *x = 10; ERROR
}
Загрузка рада (апплет Java). Это не свободно, но это относительно дешево.
Или этот свободный (через другой вопрос StackOverflow)