19

次のコードがあります。

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");

最初のアサーションは失敗し、2 番目のアサーションは失敗しないと思います。ただしgcc 4.9.2clang 3.6反対のことを行います。コードで auto の代わりに uint16_t を使用すると、適切なアサーションが失敗し、別のアサーションが成功します。

PS最初は、1代わりにstatic_cast<uint16_t>(1)、数値リテラルがint型であるという事実が問題の原因であると考えていましたが、1ここで明示的にキャストした後でも間違ったアサーションが失敗しました。

4

2 に答える 2

8

算術演算は、 より小さい型では機能しませんintuint16_tそのため、が より小さい場合は、加算を実行する前に (必要に応じて他のオペランドと一致させるために、より大きな型に)昇格されintます。int

追加の結果は、昇格された型になります。別のタイプが必要な場合は、後で変換する必要があります。

于 2015-05-12T13:22:17.880 に答える