Следующий код не компилируется:
#include <iostream>
#include <memory>
class A
{
public:
A( )
: m_i( new int )
{ }
std::shared_ptr< const int >&
get( )
{
return m_i; // <-- invalid initialization of reference of type
// 'std::shared_ptr<const int>&' from
// expression of type 'std::shared_ptr<int>'
}
private:
std::shared_ptr< int > m_i;
};int main( )
{
A a;
auto& i = a.get( );
std::cout << *i << std::endl;
return 0;
}
Как можно привести из общего указателя к общему указателю на постоянный объект? static_cast
также не удается.
Измени свой get
в
std::shared_ptr<const int> get( )
который удалит то, что по существу является свисающей ссылкой, и компиляция будет успешной.
Если вызывающая сторона A::get
только хочет наблюдать m_i
и не хочет получать совместное владение, тогда я просто вернул бы указатель на const:
const int* get( ) { return m_i.get(); }
Удержание ссылки на смарт-указатель не безопаснее, чем необработанный указатель. Если владелец умного указателя выходит из области видимости, у вас будет свисающая ссылка на умный указатель.