std::bitset<8> b(1);
std::cout << b << std::endl << b.flip(1) << std::endl << b;
Почему вывод на консоль после этих инструкций
00000011
00000011
00000011
, а не
00000001
00000011
00000011
?
Ответ
В C++ порядок вычисления аргументов функции не определен (Стандарт С++ секция 5.2.2/8).
Вы можете думать о конструкции (опустим << std::endl << b; для краткости)
std::cout << b << std::endl << b.flip(1);
как о:
std::operator<<(std::operator<<(std::cout, b), b.flip(1));
Очевидно, что, исходя из стандарта, ничто не мешает компилятору сначала посчитать b.flip(1). Соответственно, возникает неопределенное поведение (так как ближайшая точка следования находится при вызове функции, после вычисления ее аргументов).
P.S. Вот хорошая статья на тему точек следования.
Комментариев нет:
Отправить комментарий