C ++ 11、C ++ 14-型推論には次のルールが使用されました。
int foo(){ return 1; } auto x = foo(); // x = int auto x{foo()}; // x = initializer_list<int>
通常の初期化と数値化された初期化の違いは直感的でなく、奇妙でした。 また、初期化キャプチャでは直感的ではありませんでした。
スコットマイヤーズは彼の本でこれに注意を払っています。
[x = foo()](){} // x = int [x{foo()}](){} // x = initializer_list<int>
戻り値のタイプの結論は、この問題を部分的に解決しました。
auto f() { return {1,2}; // , {1,2} }
しかし、別の変数autoの場合、状況は再び現れます
auto f() { auto x{1,2}; // x = initializer_list<int> return x; // initializer_list, }
C ++ 17では、カーリー初期化のルールは次のようになりました。
1.エレメントが1つだけのカーリー初期化では、タイプはこのエレメントのタイプから推測されます。
auto x { 1 }; // x = int
2.複数の要素を使用したカーリー初期化では、出力は不可能になります。
auto x1 { 1, 2 }; // : auto
3. 1つ以上の要素と割り当てによるカーリー初期化では、タイプはstd :: initializer_listとして表示されます
auto x = { 1, 2 }; // x = std::initializer_list<int>
→ オファー
→ 標準ドラフト-7.1.7.4.1プレースホルダータイプの控除
PSコメントでは、標準に該当する変更は元の提案とわずかに異なることがわかりました。 記事を修正しました。