:ブレース-INIT-リストの初期リスト内コンストラクタに適用するときに、括弧内のイニシャライザリストにシーケンスポイントがありますか? n4296のC++標準の文書によれば
[dcl.init.list](8.5.4.4)(pg223-224)
、パック拡張の結果である (14.5.3)を含む 初期化子節は、表示される順に評価されます。すなわち、 すべての値計算および指定された initializer-clauseに関連するすべての値の計算および副作用は、すべての値計算の前に順序付けされ、 副作用は のイニシャライザリストのコンマで区切られたリストに続く。 [注:この の評価順序は、 初期化のセマンティクスに関係なく保持されます。たとえば、 のinitializer-listの要素が、コンストラクタ呼び出しの引数として解釈されるときに適用されます( )。通常は、呼び出しの引数には配列制約がありません。末端ノート]
(強調鉱山)
ノートがここに追加されました:
#include <iostream>
struct MyType {
MyType(int i, int j, int k, int l)
: sum(i + j + k + l)
{
}
int sum;
};
int main()
{
int i = 0;
std::cout << MyType{ ++i, ++i, ++i, ++i }.sum << '\n';
}
「10を印刷する必要があります:http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#1030
これは、次のコードは、と私に読み込みます"
これは私の推論です:
- がMyTypeが
- ブレース-INIT-リストは順番 それはの引数として を解釈しても
- で評価されているブレース-INIT-リストを経由して初期化されていますコンストラクタ呼び出しは
- これは、それが(1,2,3,4)
#include <initializer_list>
#include <iostream>
int main()
{
int i = 0;
std::initializer_list<int> il{++i, ++i, ++i, ++i};
std::cout << *il.begin() + *(il.begin() + 1) + *(il.begin() + 2) + *(il.begin() + 3) << '\n';
}
しかし、それはない:上記のコードは、まさにこのコードのように振る舞うべき、と言うことです10
。最初の例印刷物16「」と第2の例のプリント「10」
私は版画「16」に私の手を得ることができ、すべてのベンダーから文字通りすべてのコンパイラ、一見標準のその部分を無視し、配列を挿入することではありませんポイント。
私はここで何が欠けていますか?
注:以下は、この質問に関連すると思われる。
試したコンパイラはどれですか? –
gccのバージョン5.3.0(i686-posix-dwarf-rev0、MinGW-W64プロジェクトで構築された) –
N4296は「標準」ではなく、C++ 17の標準化プロセスの作業草案です。 –