Dynamique de casting pour unique_ptr

Comme c'était le cas dans le Boost C++11 donne quelques fonctions pour la coulée shared_ptr:

std::static_pointer_cast
std::dynamic_pointer_cast
std::const_pointer_cast

Je me demande, cependant, pourquoi il n'y a pas d'équivalents de fonctions pour unique_ptr.

Considérons l'exemple simple suivant:

class A { virtual ~A(); ... }
class B : public A { ... }

unique_ptr<A> pA(new B(...));

unique_ptr<A> qA = std::move(pA); //This is legal since there is no casting
unique_ptr<B> pB = std::move(pA); //This is not legal

//I would like to do something like:
//(Of course, it is not valid, but that would be the idea)
unique_ptr<B> pB = std::move(std::dynamic_pointer_cast<B>(pA));

Est-il une raison pourquoi ce mode d'utilisation est déconseillée, et donc, des fonctions équivalentes à celles présentes dans shared_ptr ne sont pas fournis pour unique_ptr?

  • Si la dynamique de la conversion échoue voulez-vous auparavant la propriété de l'objet à être détruit?
  • Si l'objet pointé par pA n'est pas convertible de type B (qui est, dynamic_cast<B>(pA.get()) échoue), que voulez-vous arriver à l'objet? Devrait pA conserver la propriété? Faut-il être détruit?
  • C'est effectivement un bon point. C'est en fait une importante décision de mise en œuvre. Probablement, si dynamic_cast échoue, "le sens commun" conseille d'abandonner le casting, sans modifier l'original pointeur. C'est en fait le comportement dans cdhowie de réponse.
InformationsquelleAutor betabandido | 2012-06-12