Приведение из общего указателя к общему указателю в const

Следующий код не компилируется:

#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 также не удается.

2

Решение

Измени свой get в

std::shared_ptr<const int> get( )

который удалит то, что по существу является свисающей ссылкой, и компиляция будет успешной.

7

Другие решения

Если вызывающая сторона A::get только хочет наблюдать m_i и не хочет получать совместное владение, тогда я просто вернул бы указатель на const:

const int* get( ) { return m_i.get(); }

Удержание ссылки на смарт-указатель не безопаснее, чем необработанный указатель. Если владелец умного указателя выходит из области видимости, у вас будет свисающая ссылка на умный указатель.

7

По вопросам рекламы [email protected]