2017-09-07 2 views
0

なぜthisが静的​​メンバー関数で未評価のコンテキストで使用できないのですか?静的メンバー関数の未評価のコンテキストで

struct A 
{ 
    void f() {} 
    static void callback(void * self) // passed to C function 
    { 
     static_cast< decltype(this) >(self)->f(); 
    } 
}; 

このコードは、エラーを与える:

error: 'this' is unavailable for static member functions

static_cast< decltype(this) >(self)->f(); 
         ^~~~ 

decltype(this)が(時にはそれがVeryVeryLongClassName *、その後、はるかに短い)簡潔にするために必要とされ、他の利点は、意図がより明確であるという事実です。

スタティックメンバー関数の評価されていないコンテキストでthisを使用することについての標準は何ですか?

+0

可能重複https://stackoverflow.com/questions/21143275/c-type-of-enclosing-class-in-static-member-function ) –

答えて

6

私は未評価のコンテキスト内thisが表示されますが、あなたは静的メンバ関数にdoesn't exist何かに呼ばれたことが問題にどのように表示されていないので、どのようにコンパイラは、このコンテキスト内thisの種類を推定することになっていますか?当然の結果として

、非静的メンバ関数にtype of thisは、それがなかった場合、メンバ関数はconst、及びT *た場合メンバ関数、decltype(this)T const*を生じる前記のCV-修飾子に依存しています。したがって、型は式のコンテキストに依存します。あなたの例では、コンテキストにはthisポインタがありません。

クラスに名前を付けなければならないという苦痛を軽減するために、クラスのエイリアスを追加できます。

class VeryVeryLongClassName 
{ 
    using self = VeryVeryLongClassName; 
}; 
([スタティックメンバ関数で囲むクラスのC++タイプ]の
関連する問題