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

標準準拠のコンパイラに期待される 2 つの動作はどれですか?

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>();

有効である必要があります。最初の 2 つが 14.4/12 の例で言及されていないという事実は、例が規範的ではないため、これに影響を与えるべきではありません。

于 2013-05-22T12:44:04.877 に答える