6

があり、その内容 (つまり、公開されていない配列メンバー)std::array<T, n>への配列参照を取得したいとします。elems

が ではなくをstd::array<T, n>::data()返すことに驚いたので、何らかのキャストが必要なようです。私は書くことができます:T *T (&)[n]

std::array<int, 5> arr;
int (&ref)[5] = *reinterpret_cast<int (*)[5]>(arr.data());

ただし、これは見た目が悪く、安全でない可能性があります。それは正当な (明確に定義された) コードですか?これを行うためのより良い方法はありますか?

4

2 に答える 2

3

標準は の基になる実装を提供していませんがarray、基になる表現として使用する場合int[5]、その実装ではキャストのみが (移植不可能な) 合法になります。他の基礎となる表現については、厳密なエイリアシング ルールに違反し、未定義の動作に入ります。

配列を配列として返そうとする代わりに、イテレータのペアを使用して、標準ライブラリの前例に従って、関心のある範囲を区切ることができますか?

于 2012-12-04T16:37:02.490 に答える
0

C++ の配列は欠陥のある型です (ここでは ではなく C スタイルの配列について話していますstd::array)。その理由は、配列のサイズがメモリのどこにも格納されておらず、コンパイル時にのみ認識されるためです。配列を他の型 (通常はポインター) にキャストすると、配列のサイズが失われます。

これで、リバース キャストを実行できないことがわかります。これは、最初のメンバーへのポインターだけを見て、コンパイラーが配列のサイズを知る方法がないためです。すでに提案されているように、代わりに反復子のペアを使用できます。

于 2012-12-04T16:56:13.627 に答える