Чем больше вы верите в надежность компилятора, тем труднее вам будет разобраться в ситуации, когда аналогичные глюки полезут из gcc или clang
Не особо. И в моей практике баг в clang вылез ровно один раз (и выглядел он не как неправильная работа программы, а как OOM при компиляции).
В таком виде это вполне может быть лишь иллюстрацией того, о чем я говорю. То есть вполне может быть, что "неправильная работа программы" в вашей практике вылезала намного чаще. Но вы просто
не замечали этого, ибо свято верили в непогрешимость компилятора.
Всякий раз, когда я привожу этот пример для GCC
#include <cstdint>
#include <cstdio>
std::uint16_t foo(std::uint16_t abgr)
{
return (abgr ^= (abgr >> 8)) ^= (abgr << 8);
}
int main()
{
std::uint16_t tmp = 0xAABB;
std::printf("%x %x\n", tmp, foo(tmp));
}
требуется время, чтобы убедить собравшихся, что правильный вывод в современном С++ -
aabb 1111, а не
aabb bb11, которое до сих пор упорно выдает GCC.