Является ли идиома safe-bool устаревшей в С++ 11?

Этот ответ @R. Martinho Fernandes показывает, что идиома safe-bool явно устарела в С++ 11, поскольку ее можно заменить простым

explicit operator bool() const;

в соответствии со стандартной цитатой в ответе §4 [conv] p3:

Выражение e может быть неявно преобразовано в тип T тогда и только тогда, когда декларация T t=e; хорошо сформирована для некоторой изобретенной временной переменной T (§8.5). Для некоторых языковых конструкций требуется, чтобы выражение было преобразовано в логическое значение. Выражение e, появляющееся в таком контексте, называется контекстно-преобразованным до bool, а корректно сформировано тогда и только тогда, когда декларация bool t(e); хорошо сформирована, для некоторой изобретенной временной переменной t (§8.5).

В выделенной части четко отображается "неявное явное литье" (называемое "контекстуальное преобразование" в стандарте) как @R. Мартиньо выразился.

"Определенные языковые конструкции", которые требуют, чтобы "неявный явный приведение" выглядел следующим образом:

  • if, while, for (§6.4 [stmt.select] p4)
  • двоичные логические операторы && и || (§5.14 [expr.log.and/or] p1 для обоих)
  • оператор логического отрицания ! (§5.3.1 [expr.unary.op] p9)
  • условный оператор ?: (§5.14 [expr.cond] p1)
  • static_assert (§7 [dcl.dcl] p4)
  • noexcept (§15.4 [except.spec] p2)

Является ли наше предположение в названии правильным? Надеюсь, мы не упустили никаких потенциальных недостатков.

Ответ 1

Да. Это пример для проблем, имеющих только неявные пользовательские преобразования, и явные пользовательские операторы преобразования были практически изобретены из-за этой проблемы и заменили все безопасные с чем-то более чистым и логичным.

Ответ 2

Я бы не назвал его "устаревшим". Не все сейчас прыгают на С++ 11 (даже не 1 год). И даже если бы было хорошее количество кодировщиков, способность поддерживать обратную совместимость кода была бы обязательной, учитывая, что такая идиома кажется более разумной для библиотек, чем для собственно программ.