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

Этот ответ @R. Мартиньо Фернандес показывает, что идиома safe-bool явно устарела в C ++ 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 / или] 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 )

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

174
задан Community 23 May 2017 в 10:31
поделиться