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