2016-11-29 8 views
2

UPDATE:型鋳造参照渡したときに

typedef uint16_t UnicodeChar; 

UPDATE 2:配列のサイズが一致していないので、キャストすることは禁じられているように見えるかもしれません。この場合
。なぜそれが次に動作しないのかベットしてください。たとえば、サイズが10のu_array(前の20ではない)を渡しています。


1.私はこの

void func(uint16_t (&pin_code)[10]) 
{ 
    // do stuff 
} 

と配列(ここでUnicodeCharは明らかに16ビットである)のような機能を持っている:

私はあることを、この配列をキャストする必要がありますどのように
Unicode::UnicodeChar u_array[20]; 

func()に渡すことができますか?ところで

が、これは、エラーなしでコンパイル:

func((uint16_t (&)[10])u_array); 

しかし、これはしていません:

func(static_cast<uint16_t (&)[10]>(u_array)); 

2.ことがあるのはなぜ?

3.(一般的なもの)その配列の種類はどのように書き込まれますか?たとえば、int (*)[10]は10個の整数の配列へのポインタであり、int (&)[10]は10個の整数の配列への参照ですが、配列自体は? int [10]

4.私はreference型にarray型オブジェクトをキャストしようとしていたとき、私は数で修正アム?

+1

は 'はUnicode :: UnicodeChar' –

+1

の定義は実際には'のUnicode :: UnicodeChar'が16ビットである*ない* "明白" のショー。 –

+0

また、ポインタと長さの代わりに配列への参照を 'func'に渡す理由は何ですか?あるいは、 'std :: array'や' std :: vector'のような標準コンテナを使用しますか?あるいは、「配列のサイズ」テンプレート関数を使用することもできますか?配列を別の配列にすることはできません。'func'が配列の* contents *を変更したければ、ポインタで十分です。 –

答えて

2
  1. "は20 UnicodeCharのアレイ" は、 "10 uint16_tの配列" とエイリアスされているため、これはreinterpret_castある4

  2. を参照してください。したがってstatic_castは機能しません。 Cスタイルのキャストは、ソースタイプと宛先タイプとしてstatic_castが定義されていない場合、reinterpret_castに解決されます。

  3. int[10]は、10の整数の配列型です。

  4. C++標準では、このような配列の "スライス"のエイリアスが許可されているかどうかは不明です。しかし、私はそれがうまくいくと思います。しかし、この操作を必要としないように機能を再設計することができます。