#include <initializer_list>
#include <utility>
void foo(std::initializer_list<std::pair<int,int>>) {}
template <class T> void bar(T) {}
int main() {
foo({{0,1}}); //This works
foo({{0,1},{1,2}}); //This works
bar({{0,1}}); //This warns
bar({{0,1},{1,2}}); //This fails
bar(std::initializer_list<std::pair<int,int>>({{0,1},{1,2}})); //This works
}
これは、GCC 4.5.3でコンパイルされませんが、それはno matching function for call to ‘bar(<brace-enclosed initializer list>)’
を言ってマークされた行のためのdeducing ‘T’ as ‘std::initializer_list<std::initializer_list<int> >’
を言ってマークされた行に対する警告やエラーを与える初期化子リストの種類を推測しないでください。なぜgccはbarへの最初の呼び出しのタイプを推測することができますが、2番目の呼び出しの推測はできません。長くて醜いキャスティング以外にこれを修正する方法はありますか?テンプレートは常に
[テンプレートがイニシャライザリストを受け入れないのはなぜですか](http://stackoverflow.com/questions/4757614/why-doesnt-my-template-accept-an-initializer-list) - その質問基本的には重複しています。型控除がイニシャライザリスト上で全く行われているという事実はg ++の拡張です。 – Omnifarious
@これらが詐欺であるかどうかは不明です。私の質問は、明らかにこの質問よりも少ない詳細を求めることを意図していました。 –