2016-08-15 19 views
0

initializer_listの順序付けられていない要素をどのように初期化できますか?std :: initializer_listの初期化

#include <unordered_map> 
#include <string> 

using Type = std::unordered_map<std::string, int>; 
void foo(std::initializer_list<Type> l) {} 

int main() 
{ 
    Type x = {{"xxx", 0}, {"yyy", 1}}; // compile fine 
    // std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}}; 
    // foo({{"xxx", 0}, {"yyy", 1}}); 
} 

私は最初の行のコメントを解除した場合、私は(G ++ 6.1.1)エラーました:私がしたいものを、終わりに

error: could not convert ‘{{"xxx", 0}, {"yyy", 1}}’ from ‘’ to ‘std::initializer_list, int> >’ std::initializer_list y = {{"xxx", 0}, {"yyy", 1}};

をたとえば、次のコードを考えてみ
コンパイルもしない2番目のコメント行のようにfooを呼び出すことができます。

+3

'foo({{{" xxx "、0}、{" yyy "、1}}}))' – jaggedSpire

答えて

3

あなたに{}のセットがありません。あなたは

{{{"xxx", 0}}, {{"yyy", 1}}} 

内部{}マップから構成されstd::inializer_list<std::pair<std::string, int>>ためstd::pair<std::string, int>作成しておく必要があります。次のレベルアップではstd::inializer_list<std::pair<std::string, int>>の各マップを作成してstd::initializer_list<Type>の各マップを作成します。最も外側の{}は、std::initializer_list<Type>の範囲です。私たちは、あなたがSTDを初期化しようとしている::のinitializer_list、最初のマップは一つのエントリを有し、第2のマップは、行番号2 2.

1

中かっこがありません。 {{"xxx", 0}, {"yyy", 1}}Typeの罰金初期化子ですが、ちょうど1 unordered_mapを含むType秒のリストについては、あなたは

{{{"xxx", 0}, {"yyy", 1}}} 

を必要とするか、または1組で2 unordered_mapのそれぞれを含むType秒のリスト、ため

{{{"xxx", 0}}, {{"yyy", 1}}} 
1

を持ってstd::initializer_list<Type>ある

foo({{{"xxx", 0}}, {{"yyy", 1},{"zzz", 2}}}); 

にそれを拡張することができますstd :: unordered_mapのものですが、unordered_mapだけの引数を与えています。別のブレースセットを追加すると、問題が解決されます。

#include <unordered_map> 
#include <string> 

using Type = std::unordered_map<std::string, int>; 
void foo(std::initializer_list<Type> l) {} 

int main() 
{ 
    Type x = {{"xxx", 0}, {"yyy", 1}}; // compile fine 
    //initialization for std::unordered_map<std::string, int> 
    // std::initializer_list<Type> y = {{"xxx", 0}, {"yyy", 1}}; 

    //correct initialization, each std::unordered_map has exactly 1 element in it 
    std::initializer_list<Type> y = { {{"xxx", 0}}, {{"yyy", 1}}} 

    // foo({{"xxx", 0}, {"yyy", 1}}); //As before 
    foo({{{"xxx", 0}}, {"yyy", 1}}}); //Correct call 
} 
関連する問題