2012-02-06 2 views
1
bool is_sentinel() const 
{ 
    return milliseconds==~uintmax_t(0); 
} 

Я нашел эту строку кода в thread_data.hpp, мне интересно, почему это ~uintmax_t(0) вместо -1?подталкивание код нить ~ uintmax_t (0)

EDIT:

, если причина, чтобы избежать предупреждений компилятора, почему не использовать:

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

?

+1

[Соответствующий, но не ответ] (http://stackoverflow.com/questions/809227/is-it-safe-to-use-1-to-set-all-bits-to-true) –

ответ

2

Одна из причин использования uintmax_t в первую очередь заключается в том, что мы не знаем, что такое самый большой тип. Это unsigned long или unsigned long long?

Мое предположение заключается в том, что использование ~uintmax_t(0) для получения большого значения без знака просто порождает наименьшее количество предупреждений о наибольшем числе компиляторов.

Общеизвестно, что компиляторы предупреждают, что вы смешиваете значения с подписью и без знака, или используя минус на неподписанном значении (-1ull), на удивление (?) Дает результат без знака.

+0

Почему не использовать std :: numeric_limits (decltype (миллисекунды)> :: max() вместо ~ uintmax_t (0)? – Guillaume07

+0

@guillaume - Возможно, потому что это функция, а не константа времени компиляции (улучшенная до 'constexpr' в C + +11). –

0

С milliseconds является неподписанным, по сравнению с -1 не имеет никакого смысла.

1

~uintmax_t(0) - это самый простой способ получить значение all-ones типа uintmax_t, которое не дает предупреждений компилятора.

+1

Я удивлен (и слегка разочарован), что есть компиляторы, которые предупреждают о явном 'uintmax_t (-1)'. –

+0

@Charles, что это за компиляторы? MSVC? –

+0

@ R.MartinhoFernandes: я знаю какие-то текущие. –

Смежные вопросы