パラメータパックの展開は、VS2015コンパイラによって元に戻されます。異なるC++コンパイラで、パラメータパックの展開が異なるのはなぜですか?
1
2
3
4
しかし、同じコードの実行で:私はXcodeで、このコード(打ち鳴らす-700.1.81)を実行すると
#include <iostream>
#include <vector>
template <typename... T>
void f_Swallow(T &&...)
{
}
template <typename... T>
std::vector<int> f(T ...arg)
{
std::vector<int> result;
f_Swallow
(
[&]()
{
result.push_back(arg);
return true;
}
()...
) ;
return result;
}
using namespace std;
int main()
{
auto vec = f(1,2,3,4);
for (size_t i = 0; i < vec.size(); ++i)
cout << vec[i] << endl;
}
が、私はこの結果を得る:
私は、次のコードを持っていますVS2015は次の出力を生成します。
4
3
2
1
コンパイラによってパラメータパックが異なるのはなぜですか?プラットフォームとコンパイラのバージョンを確認せずに修正する方法はありますか? 標準では展開順序について何も保証されていませんか?
これは不特定の評価順序ではありませんか? (副作用:通常は 'Swallow'イディオム配列のブレースイニシャライザはこの問題を避けるためにのみ使用されます) – milleniumbug
@milleniumbug、あなたは正しいです。そして、あなたはそれを答えとして投稿しなければなりません。 – StoryTeller
これを行う正しい方法は、構築の順序を保証するイニシャライザリストです: '' auto dummy = {(result.push_back(arg)、0)...}; '[Demo](http:// rextester .com/XHIYH83588) –