【发布时间】:2014-07-11 09:29:47
【问题描述】:
如何在 C++11 中实现以下模板函数以支持数组类型作为模板参数?当前编译失败,错误如下。有什么语法技巧可以解决这个问题吗?
template<typename T>
void destroy(T &o) { o.~T(); }
int main()
{
int x;
char y[3];
destroy(x);
destroy(y);
}
输出:
$ g++ test.cpp
test.cpp: In instantiation of ‘void destroy(T&) [with T = char [3]]’:
test.cpp:9:18: required from here
test.cpp:2:26: error: request for member ‘~char [3]’ in ‘o’, which is of non-class type ‘char [3]’
更新: 如果像 struct Storage { CharType value; 这样的包装器缓冲区} 用于代替 CharType(即 Storage* 而不是 CharType*),那么这可以允许通过 Storage::~Storage() 调用 CharType = 数组的析构函数。这可以在导致这个问题的代码中起作用。但是,问题仍然存在:是否允许在 C++ 中显式调用固定大小数组的析构函数,如果允许,那么如何执行此操作?
【问题讨论】:
-
为什么要手动调用析构函数? :(
-
这只是我需要做的一个简约版本。在我的代码中,有一个动态分配的缓冲区(不使用 new T[]),所以我需要销毁手动分配的每个元素 T。我知道 POD 类型的析构函数是无操作的。但我需要 destroy(T &) 可编译为任何具有可见析构函数的类型,包括 POD 类型。
-
@dzidzitop:最小的例子不包括这个事实:请在你的问题中动态分配对象。
-
好的。以下是无法编译的代码:github.com/dzidzitop/libafc/blob/master/src/afc/… (afc::FastStringBuffer::~FastStringBuffer())
-
是的,可以使用类似的东西。然而,问题在于 C++ 语言本身,而不是如何用类替换内置数组。
标签: c++ templates c++11 g++ g++-4.7