我遇到了this question,并且接受并且得到最多投票的答案提出了以下内容
static shared_ptr<Foo> getInstance()
{
static std::shared_ptr<Foo> instance = std::make_shared<Foo>();
return instance;
}
所以我写了这段小代码
class Manager
{
public:
static std::shared_ptr<Manager> get_instance()
{
//static std::shared_ptr<Manager> instance = std::make_shared<Manager>();
static std::shared_ptr<Manager> instance(new Manager());
return instance;
}
private:
Manager() = default;
Manager(Manager const&) = delete;
void operator=(Manager const&) = delete;
};
int main ()
{
std::shared_ptr<Manager> ptr = Manager::get_instance();
return 0;
}
令我惊讶的是,当我使用std::make_shared
编译器(g ++ v5)时,抱怨单例构造函数是私有的(因为它应该用于单例)。第二种方式 - 直接使用new运算符 - 工作者没有问题。
这是否合理 - 它应该像那样工作吗?如果这行是有效的c ++代码,我不会感到沮丧(也许我不是纯粹主义者)。有人能为我提供进一步的解释吗 - 特别是因为make_shared通常更有效率,不是吗?