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_ptr
que evite la modificación del Bar
que 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 Bar
que 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 *const
yT const *
? Lo mismo.const
normalmente modifica lo que lo precede, por lo queT *const
es unconst
punteroT
yT const*
es un punteroconst
T
. Y es mejor evitar usarconst
nada antes.T *const
yT const *
es la misma que la diferencia entreconst shared_ptr<T>
yshared_ptr<const T>
T *const
es 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 esconst
mientras queconst shared_ptr<T> p;
es similar a loT* const p;
que significa quep
esconst
. En resumen:Lo mismo vale para
weak_ptr
yunique_ptr
.fuente
const T* p;', 'T const * p;
yT * const p
. Vea*
como un separador en el sentido de que lo que esconst
es lo que está en el mismo lado de*
.const
siempre 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 delBar
objeto a través del puntero compartido. Como valor de retorno, la const inboost::shared_ptr<Bar> const
significa 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:
const
modifica 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