Переносимость в реальном мире равных рангов без знака для преобразования со знаком - PullRequest
2 голосов
/ 27 мая 2019

Возьмите следующий код

#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 не , но наблюдаемое поведение такое же. У меня такое ощущение, что их нет, и что это преобразование, хотя оно формально определяется реализацией, на практике переносимо.

...