次のプログラムを検討してください。
#include <iostream>
int main()
{
int n = 3;
int fact = 1;
for(auto i{1};i<=n;i++)
fact*=i;
std::cout<<"fact of "<<n<<" is "<<fact;
}
オプションを使用しても、ideone で問題なくコンパイルされ-std=c++14
ます。ここでライブ デモを参照してください。しかし、C++14 では、変数はthisに従ってi
推定される必要があります。initializer_list
ブレースの初期化のための新しい型推定規則を実装する C++1z の提案があります。
直接リスト初期化の場合:
要素が 1 つしかない波括弧初期化リストの場合、自動推定はそのエントリから推定します。
複数の要素を持つ波括弧初期化リストの場合、自動推論は不適切な形式になります。
[例:
自動 x1 = { 1, 2 }; // decltype(x1) は std::initializer_list です
自動 x2 = { 1, 2.0 }; // エラー: 要素の型を推測できません
自動 x3{ 1, 2 }; // エラー: 単一の要素ではありません
自動 x4 = { 3 }; // decltype(x4) は std::initializer_list です
自動 x5{ 3 }; // decltype(x5) は int.
--終了例】
そのため、ルールは C++17 で変更されました。そのため、 を使用すると、プログラムはコンパイルされません-std=c++14
。これは g++ のバグですか? 変数は C++14 のようにi
推定されるべきではありませんか?initializer_list