Запись значения enum: int64_t в std :: ostringstream усекает его до int - PullRequest
0 голосов
/ 01 марта 2019

Этот код работает неожиданным образом с компилятором MSVC (набор инструментов v141, / std: c ++ 17):

#include <iostream>
#include <limits>
#include <sstream>
#include <stdint.h>

int main() {
    std::ostringstream ss;
    enum Enum : int64_t {muchos_digitos = std::numeric_limits<int64_t>::max() - 1000};
    ss << muchos_digitos;
    std::cout << ss.str();
    return 0;
}

В частности, он печатает «-1001».Только после сильной царапины и включения уровня предупреждения /W4 я обнаружил причину:

предупреждение C4305: «аргумент»: усечение от «main :: Enum» до «int»

Но почему это происходит?Действительно, отладчик подтверждает, что перегрузка int вызывается вместо long long, но почему?И как я могу обойти это в общем коде?Я мог бы привести muchos_digitos к int64_t, но получаю значение как typename T.Я могу понять, что это перечисление, но как я могу узнать, что это перечисление со строгой типизацией, и могу ли я определить его базовый тип?Я не думаю, что это напрямую возможно ...

Вывод корректен в GCC, но мне нужен код для работы со всеми тремя GCC, clang и MSVC.

Онлайн-демонстрация

PS Это была ошибка, что / W4 не был задан для моего проекта.Я рекомендую всем использовать этот уровень с MSVC и -pedantic-errors с GCC / clang, он действительно экономит ваше время с ошибками bizzare и удивительным поведением, когда вы замечаете его во время компиляции при написании кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...