Этот ответ @R. Мартиньо Фернандес показывает, что идиома безопасного булла в C ++ 11 явно устарела, так как ее можно заменить простым
explicit operator bool() const;
согласно стандартной цитате в ответе §4 [conv] p3
:
Выражение e может быть неявно преобразовано в тип
T
тогда и только тогда, когда объявлениеT t=e;
правильно сформировано, для некоторой изобретенной временной переменнойt
(§8.5). Некоторые языковые конструкции требуют, чтобы выражение было преобразовано в логическое значение. Выражениеe
появляется в таком контексте , как говорит, контекстуально преобразовано вbool
и хорошо сформировано , если и только если декларацияbool t(e);
хорошо сформирована , в течение некоторого изобретенный временного переменного т (§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
)
Правильно ли наше предположение в названии? Надеюсь, мы не упустили ни одного потенциального недостатка.
operator bool
. Например, если у меня естьshared_ptr
член с именем p и у меня есть этот метод:,operator bool() const { return p; }
он не скомпилируется. Это глупо ИМО.Ответы:
Да. Это пример проблем с только при наличии неявных определенного пользователя преобразования и явные операторы , определяемого пользователь преобразования практически были изобретены из - за эту проблему и заменить все сейф-Ий материал с чем - то гораздо более чистым и более логичным.
источник
Я бы не назвал это "устаревшим". Не все делают скачок в C ++ 11 (даже не один год ) на данный момент. И даже если бы было достаточное количество кодеров, возможность поддерживать код обратно совместимым была бы необходимостью, учитывая, что этот вид идиомы кажется более разумным для библиотек, чем для самих программ.
источник
--std=c++0x
задолго до того, как последний гвоздь был забит в гроб стандартов, и они решили поставить имя в спецификации ISO. Если вы не очень любитель шаблонного метапрограммирования, подробности спецификации C ++ 11 и того, что использовали люди, скорее всего, не будут иметь для вас никакого значения ... это означает, что он был старше 2011 года практически для всех практических целей даже тогда. И теперь, по моим часам, уже почти 2015 год.