在销毁此对象时推断对象的模板类型
Deducing template type of object while this object is being destroyed
>情况:我有一个声明为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();
相关文章:
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 了解 Python 中的对象类型
- 具有纯虚函数和指针数组对象类型的父类的指针数组
- 调用的对象类型 'double' 不是 report() 函数的函数或函数指针
- 基准、值、值类型、对象和对象类型(C++)
- JNI 如何将 Java 对象数组传递给相同对象类型的 C++ 数组
- 在构造过程中更改的对象类型
- 如何构建程序以避免查询对象类型?
- 如何使用Dynamic_cast获得对象类型
- 什么更有效率?在重载函数中或通过在基类函数中检查对象类型来实现
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 为什么 std::variant 不能容纳数组对象类型,而联合可以?
- 为什么类型转换对象不会更改其地址?有关对象类型的信息存储在哪里?
- 类返回对象类型,但如何返回和检查 null
- 是否可以在辅助功能中概括对象类型
- 表达式必须在C 中具有指针对象类型
- 下标需要数组或指针类型表达式必须具有指针对象类型
- 当将对象传递给具有参数作为引用类型的函数以及当其类对象类型时,会得到不同的输出
- 如何在运行时指定对象类型
- 我可以获取在重载的新运算符中使用新运算符的对象类型吗?