1. В C++ стандартную библиотеку реализуют много разных фирм. И например те моменты, которые строго не описаны в стандарте в разных реализациях могут вести себя по-разному. Например wchar_t в Linux занимает 4 байта, в Visual Studio компиляторе - 2 байта. Раньше было что char в каких-то компиляторах signed а в каких-то unsigned, сами понимаете, что будет если записать туда символ с кодом > 128.
2. Стандартная библиотека и возможности компиляторов от разных фирм реализуют разные функциональные фичи стандарта C++. Например если взять какой-нибудь новый стандарт, например C++ 23, то не все функции стандарта C++ будут реализованы во всех компиляторах, есть даже таблица какой функционал где реализован.
3. Куча библиотек платформозависима. Они низкоуровневые и работают например только в Linux.
4. По поводу "железа". Например Arm процессоры раньше требовали чтобы ты читал память по границе то ли 2 байт, то ли 4 байт (arm unaligned memory access). Т.е. адреса 0,4,8,12 и т.д. А между ними нельзя было читать память.
Это конечно сглаживается компилятором, но все-таки такие неучитанные факторы могут вылезти при работе программы. Т.е. ответ немного не в том, что C++ прям платформозависимый, а скорее со своими особенностями на каждой ОС и железе.