2

次のプログラムを検討してください。

#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. 要素が 1 つしかない波括弧初期化リストの場合、自動推定はそのエントリから推定します。

  2. 複数の要素を持つ波括弧初期化リストの場合、自動推論は不適切な形式になります。

[例:

自動 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

4

1 に答える 1

6

ブレースの初期化のための新しい型推定規則を実装する C++1z の提案があります。

ではない正確に。実際の論文へのリンクをたどると、次のように表示されます。

EWG からの指示は、これを C++14 の欠陥と見なすことです。

これは、実装者にもそれを欠陥として扱い、C++14 モードでもコンパイラの動作を変更させるのに十分です。

于 2015-11-03T13:38:14.963 に答える