Ця відповідь @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; }
він не може компілювати. Це дурне ІМО.