Является ли идиома safe-bool устаревшей в C++11?
этот ответ @R. Martinho Fernandes показывает, что идиома safe-bool устарела в C++11, так как ее можно заменить простым
explicit operator bool() const;
согласно стандартной цитате в ответе §4 [conv] p3
:
выражение e может быть неявно преобразовано в тип
T
если и только если декларацияT t=e;
хорошо сформирован, для какой-то придуманной временной переменнойt
(§8.5). Некоторые языковые конструкции требуют чтобы выражение было преобразовано в логическое значение. Выражениеe
появление в таком контексте называется контекстуально преобразованных tobool
и хорошо сформирован тогда и только тогда, когда декларацияbool t(e);
сформирован, для некоторой изобретенной временной переменной t (§8.5).
выделенная часть четко показывает " неявное явное приведение "(называемое" контекстным преобразованием " в стандарте), как выразился @R. Martinho.
в "некоторые языковые конструкции", которые требуют, чтобы" неявное явное приведение " выглядело следующим образом:
-
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
)
правильно ли наше предположение в названии? Надеюсь, мы не упустили ни одного потенциального недостатка.
2 ответов
да. Это на пример для проблем только с неявными пользовательскими преобразованиями и явными пользовательскими операторами преобразования был практически придумали из-за этой проблемы и заменить все вещи safe-bool чем-то более чистым и логичным.
Я бы не назвал это "устарело". Не все совершают скачок на C++11 (даже 1 год старый) на данный момент. И даже если бы было хорошее количество кодеров, способность поддерживать обратную совместимость кода была бы обязательной, учитывая, что такая идиома кажется более разумной для библиотек, чем для самих программ.