提升线程代码〜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()

+1

[相关,但不是答案](http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true) – 2012-02-06 10:23:26

首先使用uintmax_t的一个原因是我们不知道最大的类型是什么。是unsigned long还是unsigned long long

我的猜测是使用~uintmax_t(0)来产生一个很大的无符号值只会产生最少数量的编译器上的警告。

对于编译器来说,如果混合使用带符号和无符号值,或者使用无符号值(-1ull)上的减号(?)给出无符号结果,则会发出警告。

+0

为什么没有使用std :: numeric_limits(decltype(毫秒)> :: max()而不是〜uintmax_t(0)? – Guillaume07 2012-02-06 15:17:03

+0

@guillaume - 可能是因为这是一个函数而不是编译时间常量(在C++中改进为'constexpr') +11)。 – 2012-02-06 16:19:22

由于milliseconds未签名,因此将其与-1进行比较没有任何意义。

~uintmax_t(0)是生成不会产生编译器警告的类型为uintmax_t的全1值的最简单方法。

+1

我很惊讶(也有点失望),有编译器警告一个明确的'uintmax_t(-1)'。 – 2012-02-06 10:54:01

+0

@Charles什么编译器是那些?MSVC? – 2012-02-06 11:02:08

+0

@ R.MartinhoFernandes:我自己不知道任何现有的。 – 2012-02-06 11:04:50