情况:我有一个deque声明为deque<intmax_t> tab
,我想用推导出的模板参数来销毁它。我试过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])>()
结果:与上述相同。
我认为这是所有需要的信息。提前谢谢。
答案 0 :(得分:4)
问题是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();
答案 1 :(得分:2)
你正在基于堆栈的对象上调用析构函数,所以我认为你有兴趣稍后使用placement new,类似于这篇SO C++ stack allocated object, explicit destructor call。
在Ubuntu 10.04上使用g ++ 4.4.3,只需使用没有模板装饰的析构函数就可以为我编译并运行:
tab.~deque();
我有什么遗失的吗?
我还不能对其他帖子发表评论,但rodrigo's答案很棒。除此之外,这里还有一篇关于explicit destructors in templated contexts主题的相当长但信息量很大的帖子。
答案 2 :(得分:1)
编写函数来推断类型通常比尝试自己指定类型更容易。怎么样:
template <typename T>
void murder(T& t)
{ t.~T(); }
在C ++ 11中,您只需使用注入的类名:
tab.~deque();