Этот код работает неожиданным образом с компилятором 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 и удивительным поведением, когда вы замечаете его во время компиляции при написании кода.