4

好奇心から、std::array の LLVM 実装を調べたところ、それが構造体であることがわかりました。私が調べた他のほとんどの STL コンテナー (ベクター、キュー、マップ) はクラスです。また、標準では構造体として表示されるため、意図的です。

これがなぜなのか知っている人はいますか?

4

2 に答える 2

10

技術的には、これは構造体でもクラスでもなく、テンプレートです。

std::arrayである必要がありaggregateます。長い話を短くすると、これは最終的に何も非公開にすることができないことを意味します。したがって、 , (デフォルトですべてを非公開structにする) ではなくclass、 (デフォルトですべてを公開にする) と書くこともできます。 .

あなたが望むなら、classとにかくそれを書くことができます:

template <...>
class array {
public:
// ...

ただし、とにかくすべてを公開する必要があるため、structデフォルトでそれを行う a を使用することもできます。

于 2013-10-03T16:19:50.527 に答える
1

std::array次のように初期化できるようにPODタイプです。

std::array<int, 5> arr = { 1, 2, 3, 4, 5 };

initializer_listこれは、配列が実際には配列要素に新しいスペースを割り当てず、初期化子リストからデータをそこに移動するという点でa からの初期化とは異なりますが、括弧内のデータ (初期化されたデータ セグメントで終了)配列の内部表現。

これは、コピーや移動がないことを意味します。実際、何かを初期化するために実行されるコードはありません。実行可能ファイルがメモリにロードされるとすぐに、アレイの準備が整います。

于 2013-10-03T16:44:48.623 に答える