2017-01-13 9 views
5

私は、次のしているテンプレート関数:std :: initializer_list <int>({1,2,3})と{1,2,3}の違いは何ですか?

template<typename T> void foo2(T t) {} 

私は私が使用してそれを呼び出すことはできませんことを知っている:初期化子リストは、テンプレート引数のための非推定されるコンテキストがある

foo2({1,2,3}); 

ので。私が使用する必要があります:

foo2<std::initializer_list<int>>({1,2,3}); 

を私はまた、使用することができます。

私は違いが何であるかを思ってしまう
foo2(std::initializer_list<int>({1,2,3})); 

{1,2,3}std::initializer_list<int>({1,2,3})は?

+9

'のstd :: initializer_list ({1,2,3})' 'タイプSTDの表現である:: initializer_list '。 '{1,2,3}'は式ではありません。ブレースされたリストは、式が出現できる場所だけでなく、言語定義が明示的に許可するコンテキストでも発生します。 –

+2

@ M.M回答が0件の質問に対する回答が分かっている場合は、回答に答えていることが分かります。 (͡°ʖ̯͡°) – luk32

+2

@ luk32答えを書くために自由に感じ...私は完全な答えは、私が –

答えて

7

A braced-init list発現ないので、タイプを持っていません。あなたは

foo2({1,2,3}); 

を呼び出すと、コンパイラは{1,2,3}があなたの心に何を表すのかのタイプを知りませんし、それはコンパイルされません。

foo2<std::initializer_list<int>>({1,2,3}); 

は、ここでは、コンパイラが型を推測する必要がないので、あなたはそれを指定している、それはstd::initializer_list<int>でコンパイルされます。したがって、t{1,2,3}で初期化することができます。

コンパイラが型を推定できるので、3番目の呼び出しもコンパイルされます。 std::initializer_list<int>({1,2,3})は明らかにstd::initializer_list<int>であるため、渡されたprvalueでtを初期化できます。

+2

C++ 17では、「elution保証」ルールによって最後の段落が異なることに注意してください。ある意味では、関数の引数には値がなくなりました。それは単に関数の引数を初期化する方法になります。それとも、私が集まり、私はまだ新しいルールを習得していません。 (実際には、この場合は次の違いはありません) – Yakk

関連する問題