2012-01-06 7 views
2

は、私はC++ヘッダ<initializer_list>せずに同様の効果を得ることができますか?コンパイラのbrace-initializer-listが `std :: initializer_list`型とどの程度密接に結合されていますか?

class initializer_listnamespace std(コンパイラはこれを必要とします)に住んでいますか?

私はそれがしっかり標準に従って結合のビッグ5(GCC、MSVC、インテル、クラン、コモ)

+0

何もありません。 – ildjarn

+0

ここでは、「解決策」が何であるかわかりません。あなたは精緻化できますか?これまでのところ、いくつかの質問がありますが、解決したい問題はありません。 「同じ効果」が何を意味するかははっきりしていません。 'dynamic_cast'は' bad_cast'と関係があり、 '{1,2}}は' initializer_list <> 'と少ししか関係がありません。 –

+0

@ JohannesSchaub-litb: 'std :: initializer_list'に頼ることなく、自分のクラス(言語機能)で初期化子リストの初期化を使うことはできません。 '{1,2}'は私が自分のクラスにそれを使いたいなら、 'std :: initializer_list'とすべて関係があります。 – rubenvb

答えて

4

に機能するソリューションと元気です。これは、コンパイラで構築された配列のラッパーです(標準では、GCCがコンストラクタをポインタとサイズでどれだけ使用しているかは分かりませんが、MSVCはコンストラクタを2つ使用します)。そして、はい、名前空間stdで、ヘッダ<initializer_list>にあることが必須です。

あなたは、彼らがそれぞれのコンパイラで使用コンストラクタは、あなたのバージョンでそれをサポートし、複製したいが、TBHが、私はポイントを見て失敗かを確認する必要があると思います。

テンプレートstd::initializer_listは定義されていません。ヘッダ<initializer_list>std::initializer_listの使用の前に含まれていない場合 - タイプは(7.1.6.4)と命名されていないにも暗黙的な使用を - プログラムが悪い形成されています。

タイプstd::initializer_list<E>のオブジェクトは、イニシャライザリストから、EがE型のN要素の配列を割り当てたかのように構築されます.Nはイニシャライザリストの要素の数です。 この配列の各要素は、初期化子リストの対応する要素でコピー初期化され、std::initializer_list<E>オブジェクトはその配列を参照するように構築されます。括弧で初期化するためにMSVC上の集約初期作品以外の関連

+0

奇妙な違い。それはABIの非互換性ですか? – Potatoswatter

+0

@Potatoswatter:GCCとMSVCには互換性のあるABIがありませんが、コンストラクタが違いを生み出すとは思われません。 –

関連する問題