Ця відповідь @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, який називається p і є цей метод:, operator bool() const { return p; }він не може компілювати. Це дурне ІМО.