2

我正在为该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我们发现:

此函数通常用于从调用 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函数并同时让构造函数成为私有的。据我所知,第一个示例中的代码似乎是唯一可用的解决方案,即使它在术语或性能方面有一个众所周知的(并且记录在案的)缺点也是不言而喻的。

4

0 回答 0