C++ 析构函数的模板参数推导

C++ 析构函数的模板参数推导,c++,compiler-construction,standards,destructor,C++,Compiler Construction,Standards,Destructor,当类的析构函数被调用时,编译器应该推断模板参数吗? 以下代码: #include <iostream> template <typename T> class A{ }; int main(){ A<int> * a = new A<int>(); a->~A(); } #包括 模板 甲级{ }; int main(){ A*A=新的A(); a->~a(); } 在gcc(g++4.3.4)上编译良好,但在XLC++上编译

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

#include <iostream> 
template <typename T>
class A{
};
int main(){
   A<int> * a = new A<int>();
   a->~A();
}
#包括
模板
甲级{
};
int main(){
A*A=新的A();
a->~a();
}
在gcc(g++4.3.4)上编译良好,但在XLC++上编译失败

line 30.5: 1540-0210 (S) "A" is not a base class of
"A<int>"
第30.5行:1540-0210(S)“A”不是
“A”
这两种行为中的哪一种是标准兼容编译器的预期行为?

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

对于类型为类模板专门化的对象,显式析构函数调用(12.4)可以显式指定模板参数。[示例:

模板结构A{
~A();
};
空f(A*p,A*q){
p->A::~A();//确定:析构函数调用
q->A::~A();//确定:析构函数调用
};
--[结束示例]

第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>();
A*A=newa();
a->~a();
a->~a();
a->a::~a();
a->a::~a();
应该是有效的。
14.4/12中的示例中没有提到前两个,这一事实不应影响这一点,因为示例并不规范。

首先,除了新的原因之外,我不得不考虑这样做的原因(尽管这是一个完全有效的原因)。第二,有趣的命名,因为一个不是从任何东西派生出来的,另一个也因此不是其中的基础。第三,您是否在两种平台上都尝试了
b->derived::~derived()
?最后,Apple LLVM 4.2(clang)支持您指定的格式和我指定的格式,这是值得的。我相信标准会毫无例外地支持后者,但我必须在我的副本上掸去灰尘,在哪里引用,为什么引用。编辑:
p->~derived()
也可以。我之所以问这个问题,是因为我对什么是符合标准的行为感兴趣。你的建议有效,但没有回答这个问题……这就是为什么它是一条评论,而不是作为答案发布的原因。
A<int> * a = new A<int>();
a->~A();
a->~A<int>();
a->A<int>::~A();
a->A<int>::~A<int>();