将0作为第一个参数传递给共享指针

时间:2015-10-08 03:57:44

标签: c++ smart-pointers

我在Scott Meyrse C ++中读过,现在我正在讨论设计界面的问题。以下代码应该无效:

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

他给出了以下解释:

  

tr1::shared_ptr构造函数坚持其第一个参数为a   指针,0不是指针,它是一个int。是的,它可以兑换成   一个指针,但在这种情况下这还不够好; TR1 :: shared_ptr的   坚持一个实际的指针。

我自己尝试了类似的例子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);
}

即使传递0作为第一个参数,它也会编译并运行良好。

他究竟是什么意思?是不是已经相关了?

1 个答案:

答案 0 :(得分:1)

一个来自#include <tr1/memory>;另一个来自#include <memory>。有区别:

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);
}

它给出tr1版本但不是当前标准版本的错误。