1. ホーム
  2. c++

[解決済み] なぜstd::initializer_listは言語組み込みでないのですか?

2023-02-07 03:57:28

疑問点

なぜ std::initializer_list はコア言語組み込みなのでしょうか?

C++11 のかなり重要な機能であるにもかかわらず、独自の予約キーワード (または同様のもの) がないように思われます。

代わりに initializer_list である。 ただ 標準ライブラリのテンプレートクラスで、特別な暗黙の マッピング から、新しい braced-init-list {...} という構文があり、これはコンパイラによって処理されます。

一見したところ、この解決策はかなり ハッキー .

C++言語への新しい追加は、次のような方法で実装されるのでしょうか。 暗黙のロール でなく、いくつかのテンプレートクラスの コア 言語によるものではないのですか?


以下の例をご検討ください。

   widget<int> w = {1,2,3}; //this is how we want to use a class

なぜ新しいクラスが選ばれたのか。

   widget( std::initializer_list<T> init )

を使うのではなく、何か 似たような を使うのではなく、これらのアイデアのいずれかを使ってください。

   widget( T[] init, int length )  // (1)
   widget( T... init )             // (2)
   widget( std::vector<T> init )   // (3)

  1. が古典的な配列であれば、おそらく const を追加することができます。
  2. の三つの点はすでに言語に存在しています (var-args、現在は variadic テンプレート)、なぜ構文を再利用しないのでしょうか (そしてそれを 組み込み )
  3. を追加することで、既存のコンテナに const&

これらはすべて、すでに言語の一部となっています。私は最初の3つのアイデアしか書きませんでしたが、きっとそこには がたくさんあります。 他のアプローチもあると思います。

どのように解決するのですか?

で定義された型を返す "core" 言語機能の例はすでにありました。 std 名前空間で定義された型を返す typeid が返す std::type_info そして、(ポイントを伸ばせば) sizeof が返されます。 std::size_t .

前者の場合、このいわゆる "コア言語" 機能を使用するために、すでに標準的なヘッダを含める必要があるのです。

さて、イニシャライザー リストについては、オブジェクトを生成するためのキーワードは必要なく、構文は文脈依存の中括弧です。それ以外の点では type_info . 個人的には、キーワードがないからといって、よりハチャメチャになるとは思えません。しかし、その目的は、集合体に対してすでに許可されているのと同じ中折れイニシャライザの構文を許可することであったことを思い出してください。

ですから、おそらく将来的にはこの設計原則の多くを期待することができます。

  • 新しいキーワードを使わずに新しい機能を導入することが可能な場面がもっとあれば、委員会はそれを採用するでしょう。
  • 新しい機能が複雑な型を必要とする場合、その型は std に配置されます。

したがって

  • 新しい機能が複雑な型を必要とし、新しいキーワードを使わずに導入できる場合、新しいキーワードのない "コア言語" の構文で、以下のライブラリ型を使っているものが得られるでしょう。 std .

結局のところ、C++ にはコア言語と標準ライブラリの間の絶対的な区分はないということです。これらは標準の異なる章ですが、それぞれが他方を参照しており、それは常にそうでした。

C++11 には別のアプローチもあり、それはラムダが導入するオブジェクトに 匿名 型のオブジェクトを導入するというものです。これらは名前を持たないため、名前空間には全く存在せず、特に std . しかし、これは初期化リストには適しません。なぜなら、コンストラクタを書くときに型名を使うからです。