std :: make_shared和私有构造函数

时间:2015-11-04 22:40:40

标签: c++ shared-ptr factory make-shared private-constructor

我正在努力解决std::make_shared功能的一个(让我说)角落问题,但我没有找到替代我(不那么严重)问题的可行方法。

以下代码编译良好:

#include <memory>

class A {
    A() = default;
    A(const A &) = default;
    A(A &&) = default;
    A& operator=(const A &) = default;
    A& operator=(A &&) = default;

public:
    static std::shared_ptr<A> create() {
        // std::shared_ptr<A> ptr = std::make_shared<A>();
        std::shared_ptr<A> ptr{new A};
        return ptr;
    }
};

int main() {
    auto ptr = A::create();
}

直观地说,这是一个名为 A 的用户定义类的工厂的一个小例子。

通过查看std::make_shared的{​​{3}},我们发现:

  

此函数通常用于从调用new返回的原始指针替换共享指针的构造std :: shared_ptr(new T(args ...))。与该表达式相反,std :: make_shared通常为T对象和std :: shared_ptr的控制块分配一个内存分配(这是标准中的非绑定要求),其中std :: shared_ptr( new T(args ...))执行至少两次内存分配。

非常有趣,它可能有助于将注释行与之后立即切换。它会为函数create生成以下代码:

    static std::shared_ptr<A> create() {
        std::shared_ptr<A> ptr = std::make_shared<A>();
        // std::shared_ptr<A> ptr{new A};
        return ptr;
    }

不幸的是,由于A的私有构造函数(错误类似于error: ‘constexpr A::A()’ is private),此版本无法编译。

要清楚,问题不在于它本身的错误,我很清楚它是什么,它是有道理的。无论如何,我想知道是否有一种解决方法能够使用std::make_shared函数并让构造函数同时处于私有状态。据我所知,第一个示例中的代码似乎是唯一可用的解决方案,即使不言而喻,它在术语或性能方面存在众所周知(并且有文档记录)的缺陷。

0 个答案:

没有答案