On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 11.09.13 11:02. Заголовок: Баг компилятора GCC 4.8.1 при вычислении элементов списка инициализации (initializer-list)


Мною обнаружен серьезный баг компилятора 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.



Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 1 [только новые]





ссылка на сообщение  Отправлено: 11.09.13 12:40. Заголовок: Причина этого бага с..


Причина этого бага состоит в том, что компилятор вычисляет элементы списка инициализации справа налево. В то же время он вычисляет побочные эффекты. Чтобы убедиться в этом, исходную тестовую программу можно переписать следующим образом

 
#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;
}



Вывод программы будет

11 0

хотя правильным результатом должен быть следующий вывод

10 0




Спасибо: 0 
ПрофильЦитата Ответить
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 2
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет