以下代码无法编译:
#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
也失败了。
答案 0 :(得分:7)
将get
更改为
std::shared_ptr<const int> get( )
将删除本质上是悬空引用的内容,编译将成功。
答案 1 :(得分:7)
如果A::get
的来电者只想观察m_i
并且不想获得共享所有权,那么我只会返回一个指向const的指针:
const int* get( ) { return m_i.get(); }
持有对智能指针的引用并不比原始指针更安全。如果智能指针的所有者超出范围,您将拥有对智能指针的悬空引用。