Rozszerzenie pakietu parametrów jest odwracane przez kompilator VS2015.Dlaczego ekspansja pakietu parametrów działa inaczej w przypadku różnych kompilatorów C++?
Mam następujący kod:
#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;
}
Kiedy uruchomić ten kod w Xcode (szczęk-700.1.81), otrzymuję ten wynik:
1
2
3
4
ale sam przebieg kodu w VS2015 generuje to wyjście:
4
3
2
1
Dlaczego pakiety parametrów są różnie rozwijane w zależności od kompilatora? Czy istnieje sposób, aby to naprawić bez sprawdzania platformy i wersji kompilatora? Czy standard nie gwarantuje niczego w zamówieniu ekspansji?
Czy to nie jest tylko nieokreślona kolejność oceny? (uwaga boczna: zazwyczaj w inicjatorze tablic idiomu "połknięcia" używany jest prosty inicjator, aby uniknąć tego problemu) – milleniumbug
@milleniumbug, masz rację. I powinieneś opublikować to jako odpowiedź (choć z dodatkowym wyjaśnieniem). – StoryTeller
Prawidłowy sposób to zrobić z listą inicjalizującą, która gwarantuje kolejność konstrukcji: 'auto dummy = {(result.push_back (arg), 0) ...};' [Demo] (http: // rextester .com/XHIYH83588) –