Ответ 1
В стандарте упоминаются места, где значение может быть ", контекстуально преобразованное в bool
". Они подразделяются на четыре основные группы:
Заявления
-
if (t) /* statement */;
-
for (;t;) /* statement */;
-
while(t) /* statement */;
-
do { /* block */ } while (t);
Выражение
-
!t
-
t && t2
-
t || t2
-
t ? "true" : "false"
Тесты времени компиляции
Для этих операторов должен быть constexpr
:
-
static_assert(t);
-
noexcept(t)
Алгоритмы и понятия
-
NullablePointer T
В любом случае для стандарта требуется тип, удовлетворяющий этому понятию (например, тип
pointer
astd::unique_ptr
), он может быть контекстуально преобразован. Кроме того, возвращаемое значение операторов равенства и неравенстваNullablePointer
должно быть контекстно конвертируемым вbool
. -
std::remove_if(first, last, [&](auto){ return t; });
В любом алгоритме с параметром шаблона с именем
Predicate
илиBinaryPredicate
аргумент предиката может возвращатьT
. -
В любом алгоритме с параметром шаблона под названиемstd::sort(first, last, [&](auto){ return t; });
Compare
аргумент компаратора может возвращатьT
.
Помните, что сочетание операторов const и non-const может вызвать путаницу: