gpt4 book ai didi

c++ - 与 auto_ptr 声明不同,unique_ptr 声明是否在其模板类型为不完整类型时是明确定义的?

转载 作者:IT老高 更新时间:2023-10-28 23:15:13 26 4
gpt4 key购买 nike

我写了 this article并得到了一些让我感到困惑的评论。

这基本上归结为我看过 T2仅用作模板参数,并错误地得出结论,因此我可以借此机会进行前向声明:

struct T2;

struct T1
{
std::auto_ptr<T2> obj;
};

如果我不继续定义 T2,这将调用 UB在同一个 TU 的某个地方,因为 std::auto_ptr<T2>来电delete在其内部T2* , 和 calling delete on an pointer to an object of an incomplete type whose complete type has a non-trivial destructor is undefined :

[C++11: 5.3.5/5]: If the object being deleted has incomplete class type at the point of deletion and the complete class has a non-trivial destructor or a deallocation function, the behavior is undefined.

我碰巧使用的 GCC 工具链 — v4.3.3 (Sourcery G++ Lite 2009q1-203) — 很友好地告诉我:

note: neither the destructor nor the class-specific operator delete will be called, even if they are declared when the class is defined.

尽管在其他 GCC 版本中似乎很难获得此诊断信息。

我的提示是,如果 delete 会更容易发现这样的错误。指向不完整类型实例的指针是格式错误的而不是UB,但这似乎是一个难以解决的实现问题,所以我理解为什么它是UB。

但后来有人告诉我,如果我使用 std::unique_ptr<T2>相反,这将是安全且合规的。

n3035 据称在 20.9.10.2 说:

The template parameter T of unique_ptr may be an incomplete type.

我只能在 C++11 中找到:

[C++11: 20.7.1.1.1]:

/1 The class template default_delete serves as the default deleter (destruction policy) for the class template unique_ptr.

/2 The template parameter T of default_delete may be an incomplete type.

但是,default_deleteoperator()确实需要一个完整的类型:

[C++11: 20.7.1.1.2/4]: If T is an incomplete type, the program is ill-formed.


我想我的问题是这样的:

我文章的评论者是否正确地说,仅由以下代码组成的翻译单元是格式良好且定义良好的?还是他们错了?

struct T2;

struct T1
{
std::unique_ptr<T2> obj;
};

如果它们是正确的,编译器将如何实现这一点,因为它是 UB 有充分的理由,至少在 std::auto_ptr 时是这样。用过吗?

最佳答案

根据 GOTW #100 中的 Herb Sutter 所说, unique_ptr 在不完整类型方面遇到与 auto_ptr 相同的问题。

...although both unique_ptr and shared_ptr can be instantiated with an incomplete type, unique_ptr’s destructor requires a complete type in order to invoke delete...

他的建议是在头文件中声明包含类的析构函数(即 T1),然后将其定义放在 T2 为完整的类型。

// T1.h
struct T2;

struct T1
{
~T1();
std::unique_ptr< T2 >;
};

// T1.cpp
#include "T2.h"

T1::~T1()
{
}

关于c++ - 与 auto_ptr 声明不同,unique_ptr 声明是否在其模板类型为不完整类型时是明确定义的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12764952/

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