私はそれが簡単かつ簡単です使用して、静的なサイズの配列へのエイリアスを持っている:静的サイズの配列型をコンテナ型にできないのはなぜですか?
using triplet_t = std::uint8_t[3];
// vvvvvvvvvvvvvvvvvv <--- easier than std::uint8_t(&triplet)[3]
void f(const triplet_t &triplet) { /* whatever */ }
triplet_t t{}; // As good as std::uint8_t t[3]{};
t[0] = '0';
t[1] = '1';
t[2] = '2';
for (auto &v : t) std::cout << v << ' ';
std::cout << '\n';
// So far so good...
triplet_t t3[3]{};
for (auto &r : t3)
for(auto &v : r)
v = 42;
私もコンテナ内のエイリアスを使用することができます
std::vector<triplet_t> vt;
それとも私が思うのに使用し、すぐにvt
を使用すると、それが失敗した理由:
vt.push_back({});
GCC 8.0.0 201711
error: parenthesized initializer in array new [-fpermissive] { ::new((void *)__p) _Up(std::forward<_Args>(__args)...); } ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ error: request for member '~unsigned char [3]' in '* __p', which is of non-class type 'unsigned char [3]' destroy(_Up* __p) { __p->~_Up(); } ~~~~~~^~~
問題は、すべてのテンプレート策略をアンロールした後、配置、新しいは、括弧で囲まれて、すべてのパラメータを転送して呼び出されることのようだ、と明らかにこれは静的なサイズの配列を初期化する方法ではありません。
また、何とかコンテナはオブジェクトとして考えて、デストラクタを求めています。コンパイルに失敗しました。
std::vector<std::uint8_t[3]> vt;
vt.push_back({}); // Boom!
vt.push_back({255, 0, 0}); // Ouch!
しかし、同じメモリレイアウトとstruct
使用しても問題ありません:問題が明らかにエイリアスなし同じである私は、これはなぜ起こるか疑問に思う
struct rgb { std::uint8_t r, g, b; };
std::vector<rgb> vt;
vt.push_back({}); // Nice!
vt.push_back({255, 0, 0}); // Cool!
を、静電気にを使用する方法がありますコンテナに格納された型のサイズの配列
_ "静的サイズの配列をコンテナに格納された型として使用する方法はありますか?" _ std :: array'を使用して動作する必要があります。 – user0042
C配列はコピーできません。 – Jarod42
'triplet_t = std :: array'を使っても同じ結果が得られますか? –
dasblinkenlight