stella
stella

Reputation: 2596

Passing 0 to the shared pointer with deleter as the first argument

I'm readin Scott Meyrse C++ and now I'm at the section about deigning interfaces. The following code is supposed to be invalid:

std::tr1::shared_ptr<Investment> // attempt to create a null
pInv(0, getRidOfInvestment);     // shared_ptr with a custom deleter;
                                 // this won’t compile

He gave the following explanation:

The tr1::shared_ptr constructor insists on its first parameter being a pointer, and 0 isn’t a pointer, it’s an int. Yes, it’s convertible to a pointer, but that’s not good enough in this case; tr1::shared_ptr insists on an actual pointer.

I tried similar example myself http://coliru.stacked-crooked.com/a/4199bdf68a1d6e19

#include <iostream>
#include <memory>

struct B{
    explicit B(void *){ }
};

void del(int*){ }
int main()
{
    B b(0);
    std::shared_ptr<int*> ptr(0, del);
}

and it compiles and runs fine even in spite of passing 0 as the first argument.

What did he mean actually? Isn't that relevant already?

Upvotes: 0

Views: 58

Answers (1)

CinchBlue
CinchBlue

Reputation: 6190

One is from #include <tr1/memory>; the other is from #include <memory>. There is a difference:

http://coliru.stacked-crooked.com/a/f76ea0ef17227d9d

#include <iostream>
#include <tr1/memory>
#include <memory>

struct B{
    explicit B(void *){ }
};

void del(int*){ }
int main()
{
    B b(0);
    std::tr1::shared_ptr<int*> ptr(0, del);
    std::shared_ptr<int*> ptr2(0, del);
}

It gives the error for the tr1 version but not the current standard version.

Upvotes: 1

Related Questions