Comment passer le pointeur const à l'objet const en utilisant unique_ptr

Je veux passer un unique_ptr à une fonction d'assistance, et je veux faire en sorte que la fonction d'assistance ne modifie le pointeur, ni de l'objet pointé. Sans le unique_ptrla solution est d'avoir

void takePtr(AClass const * const aPtr) {
  //Do something with *aPtr. 
  //We cannot change aPtr, not *aPtr. 
}

(Enfin, techniquement, AClass const * aPtr est suffisant.) Et je peux appeler cela avec

AClass * aPtr2 = new AClass(3);
takePtr(aPtr2);

Je veux utiliser à la place unique_ptrmais ne peut pas comprendre comment écrire ceci. J'ai essayé

void takeUniquePtr(unique_ptr<AClass const> const & aPtr) {
  //Access *aPtr, but should not be able to change aPtr, or *aPtr. 
}

Quand je l'appelle avec

unique_ptr<AClass> aPtr(new AClass(3));
takeUniquePtr(aPtr);

il ne compile pas. L'erreur que je vois est

testcpp/hello_world.cpp:141:21: error: invalid user-defined conversion from std::unique_ptr<AClass>’ to const std::unique_ptr<const AClass>&’ [-fpermissive]

Ne devrait pas la conversion de unique_ptr<AClass> à unique_ptr<AClass const> être automatique? Ce qui me manque ici?

Par la façon dont, si je change unique_ptr<AClass const> const & aPtr à unique_ptr<AClass> const & aPtr dans la définition de la fonction, il compile, mais je peux appeler des fonctions comme aPtr->changeAClass()je ne veux pas permettre.

source d'informationauteur Yogeshwer Sharma