Является ли идиома 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 год). И даже если бы было хорошее количество кодировщиков, способность поддерживать обратную совместимость кода была бы обязательной, учитывая, что такая идиома кажется более разумной для библиотек, чем для собственно программ.