当前位置: 首页 > 知识库问答 >
问题:

Pimpl-为什么可以对不完整类型调用make_unique

陆和泰
2023-03-14

为什么要编译make_unique调用?make_unqiue不需要它的模板参数是一个完整的类型吗?

struct F;
int main()
{
  std::make_unique<F>();
}

struct F {};

这个问题源于我的PIMPL实现的“问题”:

我确实理解为什么析构函数必须在实现类(PIMPL)的cpp文件中由用户声明和定义。

class Object
{};

class CachedObjectFactory
{
public:
  CachedObjectFactory();

  ~CachedObjectFactory();
  std::shared_ptr<Object> create(int id) const;

private:
  struct CacheImpl;
  std::unique_ptr<CacheImpl> pImpl;
};
// constructor with make_unique on incomplete type ?
CachedObjectFactory::CachedObjectFactory()
  : pImpl(std::make_unique<CacheImpl>())
{}

struct CachedObjectFactory::CacheImpl
{
  std::map<int, std::shared_ptr<Object>> idToObjects;
};

//deferred destructor
CachedObjectFactory::~CachedObjectFactory() = default;

共有1个答案

逄岳
2023-03-14

make_unique有多个实例化点:翻译单元的末尾也是一个实例化点。您看到的是,编译器只有在完成cacheimpl/F之后才实例化make_unique。允许编译器这样做。如果依赖代码,代码的格式就不正确,编译器不需要检测错误。

14.6.4.1实例化点[temp.Point]

8对于函数模板、成员函数模板或类模板的成员函数或静态数据成员的专门化可以在翻译单元内具有多个实例化点,并且除了上述实例化点之外,对于在翻译单元内具有实例化点的任何这样的专门化,翻译单元的末尾也被认为是实例化点。[...]如果两个不同的实例化点根据一个定义规则(3.2)赋予一个模板专门化不同的含义,则程序是格式不良的,不需要诊断。

 类似资料:
  • 在阅读参考资料时。com文档中的std::numeric_limits,我遇到了以下声明: 还提供了所有整数类类型的专门化。(从20世纪开始) 我的问题是,我们在上面的语句中所说的整数类类型是什么意思。我的意思是,我知道是C中的内置类型。我们可以在C中提供用户定义的类。但是我从来没有读过关于整数类类型的文章。我试着在谷歌上搜索这个短语,但是没有找到任何与此相关的东西。

  • 问题内容: 我有一个通用的抽象模板类。我以为如果创建特定于类型的生产者,则可以直接在通用类中注入一些DAO服务。但是我不能。 为什么?我该如何解决? 当我注入一个例如它完美地工作。但是没有泛型… 问题答案: 当您要求 容器知道您要一个类型为的bean 。如果存在这样的bean并且其类型信息已知,则容器可以满足注入。例如,类型信息保留在带注释的方法中 容器使用反射来检索该参数化的类型,并将其与请求的

  • 问题内容: 我对为什么Integer和int可以在Java中互换使用感到困惑,即使一个是原始类型,而另一个是对象也是如此? 例如: 要么 问题答案: 发布的文章的前几句话很好地描述了它: 您不能将int(或其他原始值)放入集合中。集合只能容纳对象引用,因此您必须将原始值装箱到适当的包装器类中(在int情况下为Integer)。当您从集合中取出对象时,您将得到放入的Integer。如果需要一个int

  • 我们知道我们可以将null赋给可为null的类型。例如: 我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看的源代码,则为: 我们可以将赋给为的原因是由于隐式运算符,它允许您隐式强制转换int为。根据隐式运算符的规则,作为的右手边,必须是结构类型,但显然不是合法的结构值,那么如何做(更不用说本身就是一个结构),为什么不违反隐式运算符规则

  • 问题内容: 我为什么可以这样做: 但这不是: 它抛出: 从int到short可能的有损转换 我知道5是整数文字,您必须强制转换。我还了解,如果该值不是常数,则很明显需要抛出该错误,因为该值可能达到了short类型的限制。但是,为什么如果编译器知道我正在传递一个short可以容纳的常量(如在赋值中),则它不允许它进行编译?我的意思是,它们之间有什么区别? 问题答案: 为了理解为什么赋值类型转换在调用

  • 本文向大家介绍为什么说cookie不可以滥用?相关面试题,主要包含被问及为什么说cookie不可以滥用?时的应答技巧和注意事项,需要的朋友参考一下 1.安全问题 2.每次请求都会携带cookie,占内存,影响带宽 3.不能跨域 4.可储存的内容少