ブーストスレッドコード〜uintmax_t(0)

bool is_sentinel() const
{
    return milliseconds==~uintmax_t(0);
}

私はthread_data.hppでこのコード行を見つけましたが、なぜ -1 ではなく〜uintmax_t(0)ですか?

編集:

理由がコンパイラの警告を避けるのであれば、なぜ使用しないのですか?

std::numeric_limits(decltype(milliseconds)>::max()

1
追加された 著者 CB Bailey,

3 答え

最初にuintmax_tを使用する理由の1つは、最大のタイプが何であるかわからないということです。それは unsigned long unsigned long long ですか?

私の推測では、大きな符号なしの値を生成するために〜uintmax_t(0)を使用すると、最も多くのコンパイラで警告の数が最小になります。

-1ull )の符号なしの値にマイナスを使用すると、符号なしの結果が得られます。

2
追加された
〜uintmax_t(0)の代わりにstd :: numeric_limits(decltype(milliseconds)):: :: max()を使用しないのはなぜですか?
追加された 著者 Guillaume07,
@guillaume - これはおそらく関数であり、コンパイル時定数ではないからです(C ++ 11では constexpr に改良されています)。
追加された 著者 Bo Persson,

~uintmax_t(0) is the simplest way to produce an all-ones value of type uintmax_t that does not produce compiler warnings.

1
追加された
どのコンパイラが@Charlesですか? MSVC?
追加された 著者 R. Martinho Fernandes,
私は、明白な uintmax_t(-1)について警告するコンパイラがあることに驚いて(そして軽度に失望しています)。
追加された 著者 CB Bailey,
@ R.MartinhoFernandes:私は自分の現在のものを知らない。
追加された 著者 CB Bailey,

milliseconds は符号なしなので、 -1 と比較すると意味がありません。

0
追加された