0

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

#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>"

符合标准的编译器期望这两种行为中的哪一种?

4

1 回答 1

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 的示例中没有提到前两个这一事实不应影响这一点,因为示例不是规范性的。

于 2013-05-22T12:44:04.877 回答