19

ブレース付きイニシャライザを指定するautoと、 の型が推定されますがstd::initializer_list、テンプレート型の推定は失敗することを理解しています。

auto var = { 1, 2, 3 };   // type deduced as std::initializer_list<int>

template<class T> void f(T parameter);

f({ 1, 2, 3 });          // doesn't compile; type deduction fails

これが C++11 標準のどこで指定されているかさえ知っています: 14.8.2.5/5 箇条書き 5:

[プログラムにある場合、推定されないコンテキストです] 関連する引数がイニシャライザ リスト (8.5.4) であるが、パラメータに std::initializer_list またはおそらく cv 修飾された std::initializer_list への参照がない関数パラメータタイプ。【例:

テンプレート void g(T);

g({1,2,3}); // エラー: T の引数が推定されません

—<em>例の終了]

私が知らない、または理解していないのは、型推論の動作にこの違いが存在する理由です。C++14 CD の仕様は C++11 と同じであるため、おそらく標準化委員会は C++11 の動作を欠陥とは見なしていません。

autoブレース付きイニシャライザの型を推測する理由を知っている人はいますが、テンプレートは許可されていませんか? 「これが理由かもしれない」という形式の憶測的な説明は興味深いものですが、私は、標準がそのように書かれた理由を知っている人々からの説明に特に興味があります。

4

3 に答える 3