C ++ 17の自動初期化による自動出力の変更

GCC7 は、最新の C ++ 17 標準 (今年採用予定)を実装しています。 タイプautoの出力規則がカーリー初期化で変更されたという事実に注意を喚起したいと思います。



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コメントでは、標準に該当する変更は元の提案とわずかに異なることがわかりました。 記事を修正しました。



All Articles