2017-07-10 26 views
1

入力パラメータの1つがchar const* bufferのC++関数を持っています。私が理解しているのは、この配列の基になる値を変更することができますが、ポインタ自体を別のものを指すように移動することはできないということです。異なるタイプ間のconstポインタのキャスト

ここでは、この配列をunsigned shortと解釈し、いくつかの操作を行います。だから私は次のようなことをします:

char const * current = &buffer[currentLine]; // Points to some location 
unsigned short * const values = static_cast<unsigned short * const>(current); 
// Change some of these values 

この結果、invalid cast from top char * const to type short unsigned int * constになります。

このキャスティングはどのように実行する必要がありますか?

+0

私は 'reinterpret_cast'を実行してもOKです。誰かがそれがなぜそんなに説明できますか? – Luca

+0

です。「reinterpret_cast」はエイリアシングルールに違反しているため、このキャストを実際に悪いアイデアであってもキャストすることを意味しているためです。一連のバイトを何らかの他の型として再解釈するために定義された方法は、それらのバイトをあらかじめ割り当てられた '' unsigned short''の初期化されていない配列(例えば、 –

+0

...またはもちろんreadもともと 'SomeOtherType'がなければ' char * 'から' SomeOtherType * 'にキャストします(注:逆はOKです)。 –

答えて

2

私はそれを理解する方法は、この配列 の基礎となる値を変更することができますが、ポインタ自体は他の 何かを指すように移動することができないということです。

いいえ。つまり、このポインタが指すエンティティを変更することはできませんが、ポインタ自体を変更することができます。どのようにこのキャストを実行する必要があります

const char* const buffer; 
      ^^^^^ 

:?あなたは、ポインタ自体constをしなければならないポインタを変更すること禁止しますか

キャストはreinterpret_castで実行する必要があります。

reinterpret_castを使用して以下の変換を行うことができます。ただし、そのような変換がconstnessまたはvolatileを避ける場合を除きます。

...

5)式T1のオブジェクトへの任意のポインタは別の型のCV T2のオブジェクトへのポインタに変換することができます。

だから、書く必要があります:

unsigned short * const values = reinterpret_cast<unsigned short * const>(current); 

かさえ:あなたは別の無関係なポインタ型の間でキャストを実行しようとするため

decltype(auto) values = reinterpret_cast<unsigned short * const>(current); 

は最後に、static_castは、ここでは適用されません。

+0

変換は許可されていますが、この場合は結果を逆参照するのではなく、元の型のポインタにキャストするだけです。 –

+0

decltype(auto ) 'declarypeの前に予想されるprimary-expresson'エラーで失敗する – Luca

+0

@Luca完全なC++ 14をサポートするコンパイラを使用していますか? –

2

タイプの安全性を助けるため、各キャストには限定された変換があります。これにより、意図しない変換を誤って実行した場合にコンパイラが警告を発することができるように、キャストと何をするのかを伝えるのを助けることができます。

static_castは、比較的安全なキャスト演算子です。すでに暗黙的に許可されているものを含め、最も一般的で安全な変換が可能です。これには無関係なポインタ型間の変換は含まれません。これはしばしば危険です。使用する正しいキャスト演算子はreinterpret_castです。 reinterpret_castは、メモリが実際にどのように表現されているかにかかわらず、ある種のメモリを特定の型として解釈したい場合に使用されます。とりわけ、無関係なポインタ型の間で変換するときに使用されます。

選択肢がある場合は、必要な作業を実行する最も制限的なキャスト演算子を使用することを常にお勧めします。これは、間違いがあった場合に通知する最も多くの機会をコンパイラに与えます。

ポインタ型の間で変換することに注意してください。 2つの型間の変換を混乱させず、2つのポインタ間の変換を混乱させないことが重要です。 charunsigned shortの間で変換する方法は、あなたがcharへのポインタunsigned shortへのポインタ間の変換と同じ方法ではありません。

関連する問題