2015-11-24 9 views
7

It is saidで、CスタイルのキャストはC++のキャストのさまざまな組み合わせを適用しようとし、最初に許可された組み合わせは使用できません。しかし、私は、Cスタイルのキャストのみが処理できる状況があり、C++のキャストの組み合わせは許されないと聞いたという気持ちがあります。Cスタイルのキャストで処理できる変換ですが、C++のキャストは

私は間違っていますか?それは本当ですか Cスタイルのキャストのいずれかコンテキスト(C++で)は、C + +キャストの適切な組み合わせに置き換えることができますか?

UPD Cheers and hth. - Alfからおかげで、我々は、C++のキャストは、彼らが定義さ期待行動を生成することができない意味で扱うことができないという例があります。上級の質問は、C++のキャストが意味を扱えないという例を提供することです。はコンパイルされません。

+1

「Cスタイルのキャストしか処理できない状況があり、C++のキャストの組み合わせは許されないと聞いた気がする」 - 聞いたことは、CがC++はそうではありません。これはC++のキャストという意味でのCスタイルのキャストの*意味*とは関係ありません。しかし、私は便利な例はありません。 –

+0

@JohnBollingerでは、C++スタイルのキャストを組み合わせて同じキャストを実行できます。 – SergeyA

+0

もちろん、それはC++スタイルのキャストを下手にします。 – emlai

答えて

11

アクセスできないベースへのキャストは、Cスタイルのキャスト(構文バリアントの1つ)としてしか表現できません。この文脈では、static_castは、アドレスを変更する可能性がありますが、static_castはベースにアクセスできません。

例:

struct Base 
{ 
    int x = 42; 
}; 

struct Oh_my 
    : private Base 
{ 
    virtual ~Oh_my() {} 
}; 

#include <iostream> 
using namespace std; 
auto main() -> int 
{ 
    Oh_my o; 
    cout << "C cast: " << ((Base&)o).x << endl; 
    cout << "reinterpret_cast: " << reinterpret_cast<Base&>(o).x << endl; 
} 

のWindows 7でのMinGWのG ++での出力:

 
C cast: 42 
reinterpret_cast: 4935184 

しかし、それはかなり未定義の動作なので、最後の出力操作だけでクラッシュする可能性があります。

+0

サンプルが役に立ちます。私の最初の考えは 'reinterpret_cast'は何でもできることでしたが、' reinterpret_cast'がポインタ演算とコンパイラ内部の知識を必要とするケースを最終的に考えました。それはあなたが思っていたものだったのですか、それとももっと良い例がありますか? –

+0

私は1つを書いて、もう1杯のコーヒーを買わなければならない。しかし、OK。 :) –

+1

@MooingDuck 'struct A {int i; };構造体B {int i; }; 'C *'から 'A *'や 'B *'のどちらかにCスタイルのキャストを行うと 'static_cast'が失敗し、 reinterpret_cast'はそれらの少なくとも1つに対して間違った結果を与えます。 – hvd