Est-il correct de retourner la valeur null shared_ptr?

Par exemple, il y a une fonction qui trouve un objet et renvoie shared_ptr, si l'objet est trouvé, et doit indiquer en quelque sorte qu'aucun objet n'a été trouvé.

std::vector<std::shared_ptr> Storage::objects;

std::shared_ptr<Object> Storage::findObject()
{
  if (objects.find)
  {
    return objects[x];
  }
  else
  {
    return nullptr;
  }
}

std::shared_ptr<Object> obj = Storage::findObject();
if (obj)
{
  print("found");
}
else
{
  print("not found");
}
  1. Est-il correct de retour shared_ptr implicitement initialisé avec nullptr comme dans le haut-exemple? Il va travailler, mais il peut être fait de cette façon? Ou dois-je retourner shared_ptr par défaut construit à la place?

  2. Dans ce cas, il serait weak? Quelle est la bonne façon de vérifier que vide weak a été retourné? par weak::expiration de la fonction ou il existe d'autres moyens? Si la vérification par weak::expiré est la seule façon alors comment puis-je distinguer que la fonction renvoyée pointeur vide, ou l'objet a été supprimé simplement(multi-thread de l'environnement)?

Situation où l'objet n'est pas trouvé, est aussi courant de la situation, comme si l'objet est trouvé.
Si vous pouvez utiliser boost, optional<T> semble être exactement ce que vous voulez (ce qui semble être à venir dans le standard C++17). Si vous ne voulez pas les frais généraux, vous fondamentalement juste à montrer que nullptr est en fait une absence de valeur et non pas une erreur.
Non, il n'y a pas de différence.
De (cplusplus.com/reference/memory/shared_ptr ) - "Un shared_ptr qui n'est pas propriétaire du pointeur est appelé un vide shared_ptr. Un shared_ptr qui pointe vers aucun objet n'est appelé null shared_ptr et ne doit pas être déréférencés. Notez bien qu'un vide shared_ptr est pas nécessairement une valeur null shared_ptr, et null shared_ptr n'est pas nécessairement un vide shared_ptr."
C'est faux.

OriginalL'auteur John Lock | 2016-05-15