Why can't I return a nullptr std::weak_ptr?

c++, c++11, shared-ptr

Solution

`weak_ptr` doesn't have any constructors that take a `nullptr_t` or raw pointers, so you cannot construct one with `nullptr` as an argument. To obtain an empty `weak_ptr` just default construct one.

std::weak_ptr<Thing> GetEntry(int someKey) const
{
    // returns a weak_ptr from mThings, or null if a Thing
    // that has someKey was not found
    return std::weak_ptr<Thing>();
    // or
    // return {};
}

Problem

So I have some code: ``` class Thing { public: Thing() = default; }; class DbOfThings { public: DbOfThings() = default; std::weak_ptr<Thing> GetEntry(int someKey) const { // returns a weak_ptr from mThings, or null if a Thing // that has someKey was not found return std::weak_ptr<Thing>(nullptr); } private // Idea is that this object owns these things, but other objects can grab a thing from here - but the thing can be killed off at any time std::vector<std::share_ptr<Thing>> mThings; ``` But this fails to compile with: no known conversion for argument 1 from 'std::nullptr_t' to 'const std::weak_ptr&' Why? Is my approch for letting other objects hold onto something that is owned by another wrong? This seems like a valid use case for weak_ptr to me. How can I make this work?

Original source

Related problems