У меня есть следующий код:
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");
и я ожидаю, что первое утверждение потерпит неудачу, а второе - нет. Однако gcc 4.9.2
и clang 3.6
делают обратное. Если я использую uint16_t вместо auto в моем коде, то утверждение завершается неудачно, а другое успешно выполняется.
P.S. Первоначально у меня было только 1
вместо static_cast<uint16_t>(1)
и считалось, что проблема вызвана тем, что числовой литерал 1
имеет тип int, но неправильное утверждение не срабатывает даже после явного приведения здесь.