組み込みの配列をstd/tr1/boost ::配列に置き換えることはいつでも安全ですか?

boost::array (or the tr1or std version) offer some nice additional features over a built-in array.

今のところ、コードベースには組み込み配列 (構成されていますが、スタイルが一致します)のみが含まれています:

WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
  memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
  ...

私は考えを得るだろうと思う。

さて、私の質問は、 boost :: array のドロップが意味をなさないコード内の場所( array は100%組み込み配列のドロップインを保持するセマンティクス? (可能性のあるコンパイラのエラーはOKです - ただ静かな振る舞いの変更が私を悩ますものです)。

つまり、コードを 上書きすることができます(たとえば):

boost::array m_lastReadFlags;

and the memcpy (possibly adapted to use c_array()or data()) and other array-like access would remain the same? Yes, of course I could also replace the local buffer by an array and remove the memcpy or use std::copy or something like that, but the point of this question is about the compatibility of built-in arrays and the array class.


更新:特に気になるのは、組み込みの配列がポインタとして使われる場所( memcpy のような場所)です。すべての発生は コンパイラ/正しく処理されますか?

割り当てについてはどうですか?

T arr1[N];//or array
T arr2[N];//or array
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...
5

1 答え

array クラスは自動配列のラッパーであるため、そうかもしれません。角括弧で囲まれた同じアクセス構文があり、ポインタを取得する必要がある場合は、その方法を知っています。どこでも std :: copy を使用してイテレータを使用することもできます。とにかく memcpy によって実装される可能性があります。

array クラスは、集約型(単純なコンストラクタ/デストラクタ/代入)ではないので、従来の集約(中括弧)イニシャライザで初期化できます。プレーンアレイ。

5
追加された