Форум » C/C++ » Баг компилятора GCC 4.8.1 при вычислении элементов списка инициализации (initializer-list) » Ответить

Баг компилятора GCC 4.8.1 при вычислении элементов списка инициализации (initializer-list)

Сыроежка: Мною обнаружен серьезный баг компилятора GCC 4.8.1 при вычислении значений элементов списка инициализации, который, фактически, перечеркивает использование списков инициализации в ваших программах, если вычисления элементов списка инициализации имеют побочные эффекты. В следующей тестовой программе правильный ожидаемый результат должен быть 10 20 Однако программа выводит вместо этого 10 10 [pre2] #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; } [/pre2] Согласно стандарту 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.

Ответов - 1

Сыроежка: Причина этого бага состоит в том, что компилятор вычисляет элементы списка инициализации справа налево. В то же время он вычисляет побочные эффекты. Чтобы убедиться в этом, исходную тестовую программу можно переписать следующим образом [pre2] #include <utility> #include <iostream> int main() { int x = 0; std::pair<int, int> p { x + 10, x++ }; std::cout << p.first << '\t' << p.second << std::endl; return 0; } [/pre2] Вывод программы будет 11 0 хотя правильным результатом должен быть следующий вывод 10 0



полная версия страницы