Мною обнаружен серьезный баг компилятора GCC 4.8.1 при вычислении значений элементов списка инициализации, который, фактически, перечеркивает использование списков инициализации в ваших программах, если вычисления элементов списка инициализации имеют побочные эффекты.
В следующей тестовой программе правильный ожидаемый результат должен быть
10 20
Однако программа выводит вместо этого
10 10
#include <utility>
#include <iostream>
int main()
{
int x = 0;
std::pair<int, int> p { ( x = 10 ), x + 10 };
std::cout << p.first << '\t' << p.second << std::endl;
return 0;
}
Согласно стандарту C++ (раздел 8.5.4 List-initialization):
4 Within the initializer-list of a braced-init-list, the initializer-clauses, including any that result from pack expansions (14.5.3),
are evaluated in the order in which they appear. That is, every value computation and
side effect associated with a given initializer-clause
is sequenced before every value computation and side effect associated with any initializer-clause that follows it in the comma-separated list of the initializer-list.