最近在写一个template与析构函数有关的东西,碰到了一个比较自己不怎么能理解的问题。我写了如下两个模板函数
1 template< typename T, typename Alloc>
2 T* air_new_t()
3 {
4 return new ( Alloc::allocBytes( sizeof( T ) )) T;
5 }
6
7 template< typename T, typename Alloc>
8 void air_delete_t(T* ptrBase)
9 {
10 if (ptrBase)
11 {
12 ptrBase->~T();
13 Alloc::deallocBytes( ( void* ) ptrBase );
14 }
15 }
然后在main函数中这使用这两个模板函数
1 int* ptr = air_new_t<int, CMemoryNedAlloc>();
2 *ptr = 10;
3 cout<<*ptr<<endl;
4 air_delete_t<int, CMemoryNedAlloc>(ptr);
以我的理解这应该是要编译错误的,因为ptr ->~int();在vs上是明显不行的。但是奇怪的是程序正常的运行了,当是基本类型时
ptrBase->~T()语句会跳过,如果是自己定义的类型则会调用ptrBase->~T()。可以肯定的是模板函数会对基本类型的虚构函数进行特殊的处理,但是如何处理,是以何种规则处理呢?这些我都不明白,问了其他人,和网上查了些但还是太明白,这里也提到了相关的东西,但是我还是不太明白。模板函数不能特化,这样也正好达到了我的目的,原本还想这用特化来处理基本类型呢。不过虽然可以达到目的,到时其中的规则和原因不太明,心里也是没啥底。应该c++的文档里有提及,但是还没怎么查过文档呢,这个东西找起来可能要花些时间,特此记录一下,等找到说明再补上。
posted on 2011-07-21 22:45
木华 阅读(945)
评论(0) 编辑 收藏 引用