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