7

昨日の投稿を参考にすると、今朝は目が覚めました。なぜこれが実際に機能するのですか?関数testに関する限り、この関数には本体がないので、どのように実行できますか?これがなぜ、どのように機能するのか知りたいですか?私はあなたの答えを見ることに本当に興味があります。

template<typename T> 
class IsClassT { 
  private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(int C::*); //NO BODY HERE
    template<typename C> static Two test(…); //NOR HERE
  public: 
    enum { Yes = sizeof(IsClassT<T>::template test<T>(0)) == sizeof(One) }; 
    enum { No = !Yes }; 
}; 

この非常に興味深い現象を理解するために助けを借りて事前に感謝します。

4

2 に答える 2

8
  1. test-function宣言が存在するため、コンパイル エラーは発生しません。

  2. -functionを呼び出し ていないため、リンカ エラーが発生しませんtest

C++ 標準 ISO/IEC 14882:2003(E)

5.3.3 サイズ

sizeof 演算子は、そのオペランドのオブジェクト表現のバイト数を返します。オペランドは、評価されない式か、括弧で囲まれた型 ID のいずれかです。sizeof 演算子は...

...

于 2010-03-17T11:40:35.673 に答える
6

はい列挙型を参照していると思いますか? IsClassT<T>::test<T>(0)? sizeof は実際にはその引数を評価しません。そのため、次のようなコードは合法です。

int* p = 0;
int sizeof_int = sizeof(*p); //oops, p is 0 :(
于 2010-03-17T11:07:39.417 に答える