Почему класс перечисления static_cast, базовым типом которого является int8_t, получает неожиданное значение?

  • компилятор: клан++
  • Стандарт С++: С++ 20

Я попытался запустить код, и результаты очень хорошо оправдали мои ожидания.

#include <iostream>

using namespace std;

int main()
{
    enum class Num : int
    {
        one = 1,
        two = 2,
        zero = 0
    };

    Num e = Num::one;
    auto a = static_cast<std::underlying_type_t<Num>>(e);

    cout << "-----------" << endl;
    cout << a << endl;
    cout << "-----------" << endl;
    return 0;
}

результат:

-----------
1
-----------

Но когда я сделал небольшую модификацию, изменив базовый тип класса enum с int на int8_t, результат оказался неожиданным.

#include <iostream>

using namespace std;

int main()
{
    enum class Num : int8_t // from 'int' to 'int8_t'
    {
        one = 1,
        two = 2,
        zero = 0
    };

    Num e = Num::one;
    auto a = static_cast<std::underlying_type_t<Num>>(e);

    cout << "-----------" << endl;
    cout << a << endl;
    cout << "-----------" << endl;
    return 0;
}

результат:

-----------

-----------

Что здесь случилось?


person nullptr    schedule 27.06.2020    source источник


Ответы (1)


int8_t сопоставляется с char, и этот тип по умолчанию печатается как его символьное представление. Символ со значением 1 является управляющим символом, который вы не видите.

Таким образом, cout << (int8_t)65 напечатает A, а не 65, потому что единственный символ 'A' имеет значение 65.

Вы можете избежать этого, приведя к int перед печатью: cout << (int)a или, альтернативно, используя унарный оператор плюс: cout << +a.

person CherryDT    schedule 27.06.2020