提升线程代码〜uintmax_t型(0)
bool is_sentinel() const
{
return milliseconds==~uintmax_t(0);
}
我发现这条线的thread_data.hpp代码,我想知道为什么是~uintmax_t(0)
而不是-1
?提升线程代码〜uintmax_t型(0)
编辑:
如果原因是为了避免编译器警告,为什么不使用:
std::numeric_limits(decltype(milliseconds)>::max()
?
首先使用uintmax_t的一个原因是我们不知道最大的类型是什么。是unsigned long
还是unsigned long long
?
我的猜测是使用~uintmax_t(0)
来产生一个很大的无符号值只会产生最少数量的编译器上的警告。
对于编译器来说,如果混合使用带符号和无符号值,或者使用无符号值(-1ull
)上的减号(?)给出无符号结果,则会发出警告。
为什么没有使用std :: numeric_limits(decltype(毫秒)> :: max()而不是〜uintmax_t(0)? – Guillaume07 2012-02-06 15:17:03
@guillaume - 可能是因为这是一个函数而不是编译时间常量(在C++中改进为'constexpr') +11)。 – 2012-02-06 16:19:22
由于milliseconds
未签名,因此将其与-1
进行比较没有任何意义。
~uintmax_t(0)
是生成不会产生编译器警告的类型为uintmax_t
的全1值的最简单方法。
我很惊讶(也有点失望),有编译器警告一个明确的'uintmax_t(-1)'。 – 2012-02-06 10:54:01
@Charles什么编译器是那些?MSVC? – 2012-02-06 11:02:08
@ R.MartinhoFernandes:我自己不知道任何现有的。 – 2012-02-06 11:04:50
[相关,但不是答案](http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true) – 2012-02-06 10:23:26