Estoy escribiendo un método de acceso para un puntero compartido en C ++ que es algo como esto:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Por lo tanto, para admitir la constancia del getBar()tipo de retorno debe haber un boost::shared_ptrque evite la modificación del Barque apunta. Mi conjetura es que shared_ptr<const Bar>es el tipo que quiero volver a hacer eso, mientras que const shared_ptr<Bar>impediría la reasignación del propio puntero al punto a otro Bar, sino permitir la modificación de la Barque apunte a ... Sin embargo, no estoy seguro. Le agradecería que alguien que esté seguro pudiera confirmar esto o corregirme si me equivoco. ¡Gracias!
c++
boost
const
shared-ptr
Dave Lillethun
fuente
fuente

*y->confirmarlo.T *constyT const *? Lo mismo.constnormalmente modifica lo que lo precede, por lo queT *constes unconstpunteroTyT const*es un punteroconstT. Y es mejor evitar usarconstnada antes.T *constyT const *es la misma que la diferencia entreconst shared_ptr<T>yshared_ptr<const T>T *constes un puntero constante a no constanteT, también lo esconst shared_ptr<T>. Por el contrario,T const *es un puntero no constante aconst T, también lo esshared_ptr<const T>.Respuestas:
Tienes razón.
shared_ptr<const T> p;es similar aconst T * p;(o, de manera equivalente,T const * p;), es decir, el objeto apuntado esconstmientras queconst shared_ptr<T> p;es similar a loT* const p;que significa quepesconst. En resumen:Lo mismo vale para
weak_ptryunique_ptr.fuente
const T* p;', 'T const * p;yT * const p. Vea*como un separador en el sentido de que lo que esconstes lo que está en el mismo lado de*.constsiempre se refiere a lo que está en el lado izquierdo. Si no hay nada a la izquierda, es lo que está al lado derecho.boost::shared_ptr<Bar const>evita la modificación delBarobjeto a través del puntero compartido. Como valor de retorno, la const inboost::shared_ptr<Bar> constsignifica que no puede llamar a una función no constante en el temporal devuelto; si fuera por un puntero real (por ejemploBar* const), sería completamente ignorado.En general, incluso aquí, se aplican las reglas habituales:
constmodifica lo que le precede: enboost::shared_ptr<Bar const>, elBar; enboost::shared_ptr<Bar> const, es la instanciación (la expresiónboost::shared_ptr<Bar>que es const.fuente
delete.fuente
std::make_shared()(desde C ++ 14).Me gustaría una demostración simple basada en la respuesta de @Cassio Neri:
fuente