2016-12-12 8 views
0

タイトルが言うように、ポインタがnullの場合、派生クラスへのポインタをキャストした場合、それは安全な操作ですかC++ 11/C++ 14の視点から見ると?ヌルポインタ(単一継承または複数継承)をダウンキャストするために `static_cast`を使用

struct base 
{ 
    virtual ~base() = default; 
}; 

struct derived : base {}; 

struct wrapper 
{ 
    using allowed_derived_t = derived; 
    base* base_ptr = nullptr; 

    void set_ptr(base* ptr) 
    { 
     if (!dynamic_cast<allowed_derived_t*>(ptr)) 
      throw std::logic_error("Check your user code"); 

     base_ptr = ptr; 
    } 

    allowed_derived_t* ptr() const 
    { return static_cast<allowed_derived_t*>(base_ptr); } 
}; 

私はset_ptrを呼び出す前に、それを呼び出す場合には、ptr()方法の安全ですか?ポインタを設定する前に、base_ptrは必須の型(allowed_derived_t)ではないため、動的ポインティングオブジェクトは間違った型ではありません(ポインティングオブジェクトがないため)。

そのような状況では、標準は何と言いますか?

答えて

5

すべての整形式ポインタ・キャスト・キャストは、ソース・タイプのNULLポインタがターゲット・タイプのNULLポインタに安全に変換されることを保証します。

dynamic_castのためには、動的vの値がポインタの場合に、ヌルポインタ値である場合、結果はヌルである

キャスト

5.2.7に記載されていますそれは

に記載されstatic_castについて

型Tのポインタ値

5.2.9静的

キャスト[...]ヌルポインタ値(4.10)は、先の型のヌルポインタ値に変換されます。

他のすべてのキャストでも同様の保証が提供されています。

1

static_castは、変換がコンパイル時に有効かどうかをチェックするので、キャストされたポインタのランタイム値は何の役割も果たさない。

したがって安全です。nullptrは、実行時にnullptrになります。

他のタイプのキャストにも同じことが言えます。

関連する問題