在销毁此对象时推断对象的模板类型

Deducing template type of object while this object is being destroyed

本文关键字:对象 类型      更新时间:2023-10-16

>情况:我有一个声明为deque<intmax_t> tab的deque,我想用推导的模板参数销毁它。我尝试了tab.~deque<__decltype(tab.at(0))>()这给了我编译器错误:

Csrt.cpp: In function 'int main(int32_t, char**)':
Csrt.cpp:303:34: the type being destroyed is 'std::deque<long long int>',
 but the destructor refers to 'std::deque<long long int&>'
  tab.~deque<__decltype(tab.at(0))>();
                                  ^

问题是:这样的事情可行吗?

我知道我不想做的是:创建虚拟变量。喜欢:auto dummy = tab.at(0)
我希望是可行的:单行析构函数。

我也尝试过:tab.~deque<__decltype(tab[0])>()结果:与上面相同。

我认为这就是所有需要的信息。提前谢谢你。

问题是 deque 中的 at 成员函数是这样定义的:

intmax_t &at(size_t pos);

所以你的decltype(x.at(0))实际上决心intmax_t&.

您可以使用remove_reference类型特征:

#include <type_traits>
x.~deque<std::remove_reference<decltype(x.at(0))>::type>();

但是,如果您使用每个标准容器中可用的有用成员 typedef,则更容易:

x.~deque<decltype(x)::value_type>();

当然,对于这种特殊情况,我认为您可以只使用注入的类名作为析构函数:

x.~deque();

您正在基于堆栈的对象上调用析构函数,因此我认为您有兴趣稍后使用放置新,类似于此SO帖子C++堆栈分配对象,显式析构函数调用。

在 Ubuntu 10.04 上使用 g++ 4.4.3,只需使用没有模板修饰的 desctructor 即可为我编译和运行:

tab.~deque();

我错过了什么吗?


我还不能评论别人的帖子,但罗德里戈的回答很棒。此外,这里有一篇相当长但内容丰富的 SO 帖子,主题是模板化上下文中的显式析构函数。

编写函数来推断类型通常比尝试自己指定类型更容易。怎么样:

template <typename T>
void murder(T& t)
{ t.~T(); }

在 C++11 中,您可以只使用注入的类名:

tab.~deque();