[解決済み] なぜstd::initializer_listは言語組み込みでないのですか?
疑問点
なぜ
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)
-
が古典的な配列であれば、おそらく
const
を追加することができます。 - の三つの点はすでに言語に存在しています (var-args、現在は variadic テンプレート)、なぜ構文を再利用しないのでしょうか (そしてそれを 組み込み )
-
を追加することで、既存のコンテナに
const
と&
これらはすべて、すでに言語の一部となっています。私は最初の3つのアイデアしか書きませんでしたが、きっとそこには がたくさんあります。 他のアプローチもあると思います。
どのように解決するのですか?
で定義された型を返す "core" 言語機能の例はすでにありました。
std
名前空間で定義された型を返す
typeid
が返す
std::type_info
そして、(ポイントを伸ばせば)
sizeof
が返されます。
std::size_t
.
前者の場合、このいわゆる "コア言語" 機能を使用するために、すでに標準的なヘッダを含める必要があるのです。
さて、イニシャライザー リストについては、オブジェクトを生成するためのキーワードは必要なく、構文は文脈依存の中括弧です。それ以外の点では
type_info
. 個人的には、キーワードがないからといって、よりハチャメチャになるとは思えません。しかし、その目的は、集合体に対してすでに許可されているのと同じ中折れイニシャライザの構文を許可することであったことを思い出してください。
ですから、おそらく将来的にはこの設計原則の多くを期待することができます。
- 新しいキーワードを使わずに新しい機能を導入することが可能な場面がもっとあれば、委員会はそれを採用するでしょう。
-
新しい機能が複雑な型を必要とする場合、その型は
std
に配置されます。
したがって
-
新しい機能が複雑な型を必要とし、新しいキーワードを使わずに導入できる場合、新しいキーワードのない "コア言語" の構文で、以下のライブラリ型を使っているものが得られるでしょう。
std
.
結局のところ、C++ にはコア言語と標準ライブラリの間の絶対的な区分はないということです。これらは標準の異なる章ですが、それぞれが他方を参照しており、それは常にそうでした。
C++11 には別のアプローチもあり、それはラムダが導入するオブジェクトに
匿名
型のオブジェクトを導入するというものです。これらは名前を持たないため、名前空間には全く存在せず、特に
std
. しかし、これは初期化リストには適しません。なぜなら、コンストラクタを書くときに型名を使うからです。
関連
-
[解決済み】C++エラー。アーキテクチャ x86_64 に対して未定義のシンボル
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] なぜテンプレートはヘッダーファイルでしか実装できないのですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] std::vector にある項目が存在するかどうかを調べるには?
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン