gpt4 book ai didi

c++ - 模板实例化和带有 unique_ptr 的 pimpl 习语

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:09:58 26 4
gpt4 key购买 nike

我读了 Howard Hinnant (Is std::unique_ptr<T> required to know the full definition of T?) 的这个答案,然后读了这个答案 (How is a template instantiated?),我只是在想。如果你有这样的类(class)

class Something {
Something();
~Something();
class Impl;
std::unique_ptr<Impl> impl;
};

unique_ptr将在编译类时实例化(正如我可以从上面的其他答案中看出的那样)。那为什么不上课没关系 Impl稍后定义?实例化不需要 Impl 的析构函数吗?在场?

注意以下是为了澄清我上面的问题。

我的想法是,当编译器遍历类的定义时 Something .它将看到嵌套类的声明 Impl然后它将看到 unique_ptr<Impl> 的声明, 而在这一点上。它将实例化模板 unique_ptrImpl .并且该实例化代码将包含对 Impl 的析构函数的调用。 .由于此时我们的代码包含对不完整类的析构函数的调用,上面的代码如何安全?

最佳答案

The accepted answer to the first question包含用例表,其中 Impl 的完整定义是必需的。

在您的情况下,编译器隐式生成以下成员函数:

  • 复制构造函数
  • 移动构造函数
  • 复制赋值运算符
  • 移动赋值运算符。

所有这些都需要 Impl 的完整定义.

如果您显式声明这些函数并在 Impl 的完整定义中定义它们可用,你会没事的。

更新

It will see the declaration of the nested class Impl and then it will see the declaration of the unique_ptr<Impl>, and at that point. It will instantiate the template unique_ptr with Impl.

这只是在一定程度上是正确的。不是unique_ptr的所有成员函数将在那时被实例化。

And that instantiated code will contain a call to the destructor of Impl.

不正确。编译器将生成代码(或实例化)std::unique_ptr<Impl> 的析构函数仅在需要时使用。那个地方是Something的析构函数.

Something 的析构函数需要 std::unique_ptr<Impl> 的析构函数.
std::unique_ptr<Impl> 的析构函数需要 Impl 的完整定义.

换句话说,Impl 的完整定义必须对 Something 的析构函数可见.

附言

有关模板实例化的更多信息,请访问 Template instantiation details of GCC and MS compilers .

关于c++ - 模板实例化和带有 unique_ptr 的 pimpl 习语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43382941/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com