析构函数的模板参数推导

时间:2013-05-01 17:12:30

标签: c++ compiler-construction standards destructor

当调用类的析构函数时,编译器是否应该推导出模板参数? 以下代码:

#include <iostream> 
template <typename T>
class A{
};
int main(){
   A<int> * a = new A<int>();
   a->~A();
}

在gcc上编译好(g ++ 4.3.4)但在XLC ++上用

失败
line 30.5: 1540-0210 (S) "A" is not a base class of
"A<int>"

符合标准的编译器会对这两种行为中的哪一种产生影响?

1 个答案:

答案 0 :(得分:0)

C ++ 03标准(我怀疑C ++ 11标准会有所不同)有以下段落(C ++ 03 14.3 / 5 [temp.arg]):

  

对于具有类模板特化的类型的对象,显式的析构函数调用(12.4)可以显式指定 template-arguments 。 [示例:

    template<class T> struct A {
        ~A();
    };
    void f(A<int>* p, A<int>* q) {
        p->A<int>::~A();       // OK: destructor call
        q->A<int>::~A<int>();  // OK: destructor call
    };
     

- 结束示例]

第12.4 / 12节[class.dtor]根据对常规成员函数的调用描述显式析构函数调用,并且有一个示例显示析构函数类型的显式析构函数调用,包含限定版本和非限定版本

对我而言,这清楚地表明该标准的意图是每个

A<int> * a = new A<int>();
a->~A();
a->~A<int>();
a->A<int>::~A();
a->A<int>::~A<int>();

应该有效。 14.4 / 12中的示例中未提及前两个的事实不应影响这一点,因为示例不是规范性的。