好奇心から、std::array の LLVM 実装を調べたところ、それが構造体であることがわかりました。私が調べた他のほとんどの STL コンテナー (ベクター、キュー、マップ) はクラスです。また、標準では構造体として表示されるため、意図的です。
これがなぜなのか知っている人はいますか?
技術的には、これは構造体でもクラスでもなく、テンプレートです。
std::array
である必要がありaggregate
ます。長い話を短くすると、これは最終的に何も非公開にすることができないことを意味します。したがって、 , (デフォルトですべてを非公開struct
にする) ではなくclass
、 (デフォルトですべてを公開にする) と書くこともできます。 .
あなたが望むなら、class
とにかくそれを書くことができます:
template <...>
class array {
public:
// ...
ただし、とにかくすべてを公開する必要があるため、struct
デフォルトでそれを行う a を使用することもできます。
std::array
次のように初期化できるようにPODタイプです。
std::array<int, 5> arr = { 1, 2, 3, 4, 5 };
initializer_list
これは、配列が実際には配列要素に新しいスペースを割り当てず、初期化子リストからデータをそこに移動するという点でa からの初期化とは異なりますが、括弧内のデータ (初期化されたデータ セグメントで終了)は配列の内部表現。
これは、コピーや移動がないことを意味します。実際、何かを初期化するために実行されるコードはありません。実行可能ファイルがメモリにロードされるとすぐに、アレイの準備が整います。