Mam następujący kod:Dlaczego auto jest wyprowadzona do int zamiast uint16_t
uint16_t getLastMarker(const std::string &number);
...
const auto msgMarker = getLastMarker(msg.number) + static_cast<uint16_t>(1);
static_assert(std::is_same<decltype(msgMarker), const int>::value, "Should fail");
static_assert(std::is_same<decltype(msgMarker), const uint16_t>::value, "Should not fail");
i spodziewam się, że pierwsze twierdzenie nie powiedzie się, a drugi nie. Jednak gcc 4.9.2
i clang 3.6
działają odwrotnie. Jeśli użyję uint16_t zamiast auto w moim kodzie, to poprawne stwierdzenie nie powiedzie się, a drugie się powiedzie.
P.S. Początkowo miałem tylko 1
zamiast static_cast<uint16_t>(1)
i uważałem, że problem jest spowodowany tym, że numeryczny literał 1
ma typ int, ale błędny asercja nie działa nawet po jawnym rzutowaniu tutaj.
Powiązane [Dlaczego krótki musi być konwertowany na int przed operacjami arytmetycznymi w C i C++?] (Http://stackoverflow.com/q/24371868/1708801) –
Kolejny przykład "nie używaj' auto' wszędzie". – Shoe