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