Estou escrevendo um método de acesso para um ponteiro compartilhado em C ++ que funciona mais ou menos assim:
class Foo {
public:
return_type getBar() const {
return m_bar;
}
private:
boost::shared_ptr<Bar> m_bar;
}
Portanto, para oferecer suporte à constância getBar()
do tipo de retorno deve ser um boost::shared_ptr
que evite a modificação do que Bar
ele aponta. Meu palpite é que esse shared_ptr<const Bar>
é o tipo que eu quero retornar para fazer isso, ao passo const shared_ptr<Bar>
que impediria a reatribuição do próprio ponteiro para apontar para um diferente, Bar
mas permitiria a modificação do para o Bar
qual ele aponta ... No entanto, não tenho certeza. Eu agradeceria se alguém que sabe com certeza pudesse confirmar isso ou me corrigir se eu errar. Obrigado!
c++
boost
const
shared-ptr
Dave Lillethun
fonte
fonte
*
e->
confirmar isso.T *const
eT const *
? O mesmo.const
normalmente modifica o que _precede, entãoT *const
é umconst
ponteiro paraT
eT const*
é um ponteiro paraconst
T
. E é melhor evitar o usoconst
sem nada antes disso.T *const
eT const *
é a mesma que a diferença entreconst shared_ptr<T>
eshared_ptr<const T>
T *const
é um ponteiro const para não constT
, então éconst shared_ptr<T>
. Em contraste,T const *
é um ponteiro não const paraconst T
, então éshared_ptr<const T>
.Respostas:
Você está certo.
shared_ptr<const T> p;
é semelhante aconst T * p;
(ou, equivalentemente,T const * p;
), isto é, o objeto apontado éconst
enquantoconst shared_ptr<T> p;
é semelhante aoT* const p;
que significa quep
éconst
. Em suma:O mesmo vale para
weak_ptr
eunique_ptr
.fonte
const T* p;', 'T const * p;
eT * const p
. Veja o*
como um separador no sentido de que o que éconst
é o que está do mesmo lado do*
.const
sempre se refere ao que está do lado esquerdo. Se nada está à esquerda, é a coisa à direita.boost::shared_ptr<Bar const>
impede a modificação doBar
objeto por meio do ponteiro compartilhado. Como um valor de retorno, o const inboost::shared_ptr<Bar> const
significa que você não pode chamar uma função não const no temporário retornado; se fosse por um ponteiro real (por exemploBar* const
), seria completamente ignorado.Em geral, mesmo aqui, as regras usuais se aplicam:
const
modifica o que o precede: emboost::shared_ptr<Bar const>
, oBar
; inboost::shared_ptr<Bar> const
, é a instanciação (a expressãoboost::shared_ptr<Bar>
que é const.fonte
delete
.fonte
std::make_shared()
(desde C ++ 14).Gostaria de fazer uma demonstração simples baseada na resposta de @Cassio Neri:
fonte