Возьмите следующий код
#include <iostream>
int main() {
unsigned char i = 128;
signed char j = i;
std::cout << static_cast<int>(j) << '\n';
}
компиляция в GCC приводит к -128
, как и следовало ожидать большинству программистов (при допущении CHAR_BIT == 8
, что является безопасным допущением в 2019 году). Теперь я полностью осознаю, что инициализация signed char j = i;
вызывает поведение, определяемое реализацией в стандартах C ++ до C ++ 20.
Мой вопрос : Реально говоря, кто-нибудь знает о полуинтересной реализации компилятора C ++, которая не просто делает очевидную вещь (то есть не работает в вышеупомянутом дело). Под полуинтересным я имею в виду компиляторы, с которыми я могу реально столкнуться, а не какой-то прототип компилятора Unisys C ++ 1985 года для неясной 43-битной архитектуры, к которой имеет доступ только DoD. GCC и MSVC документируют вышеуказанное поведение в своей документации, Clang не , но наблюдаемое поведение такое же. У меня такое ощущение, что их нет, и что это преобразование, хотя оно формально определяется реализацией, на практике переносимо.