当调用类的析构函数时,编译器是否应该推导出模板参数? 以下代码:
#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>"
符合标准的编译器会对这两种行为中的哪一种产生影响?
答案 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中的示例中未提及前两个的事实不应影响这一点,因为示例不是规范性的。