Как я понимаю, для boost :: shared_ptr действует следующее:
boost::shared_ptr<SomeData> ptr;
...
boost::shared_ptr<const SomeData> c_ptr = ptr; // Valid
Такое же поведение не распространяется на boost::interprocess::managed_shared_ptr
, Зачем?
boost::interprocess::managed_shared_ptr
на самом деле не является общим указателем; это просто вспомогательный класс, который вы можете использовать для определения его типа. От межпроцессные документы:
typedef managed_shared_ptr<MyType, managed_shared_memory>::type my_shared_ptr;
И создание общего указателя может быть упрощено до этого:
[C ++]
my_shared_ptr sh_ptr = make_managed_shared_ptr
(segment.construct<MyType>("object to share")(), segment);
С «sh_ptr
«Из приведенного выше примера должно работать следующее:
typedef managed_shared_ptr<const MyType, managed_shared_memory>::type my_shared_const_ptr;
my_shared_const_ptr sh_c_ptr = sh_ptr;
Поскольку эти два объекта на самом деле являются общими указателями.
С другой стороны, занимаюсь:
managed_shared_ptr<MyType, managed_shared_memory> ptr;
managed_shared_ptr<const MyType, managed_shared_memory> c_ptr = ptr;
не будет работать, потому что в этом случае ptr и c_ptr очень простые структуры которые ничего не делают, кроме как делают 3 typedefs, поэтому они не конвертируются.
Других решений пока нет …