Этот код очень должен компилировать. Стандарт потратил очень много усилий на то, чтобы он обеспечил.
Существует множество мест, где выражение «контекстно конвертировано в bool». В этих местах будут вызываться explicit
конверсии bool, если они доступны. Одним из таких контекстных преобразований является выражение if
, как в вашем случае.
Этот язык позволяет использовать explicit operator bool
типы для условной проверки if(expr)
, но вы не можете использовать другие вещи без явного преобразования. Вы не можете передать его функции, которая принимает bool
; вы не можете вернуть его из функции, которая возвращает bool
и т. д.
Все контекстные преобразования являются явными выражениями в языковых функциях. Таким образом, explicit operator bool
защищает вас от неявных пользовательских преобразований, но при этом допускает преобразования, определенные языком.
Предполагается, что это компиляция, это контекст, который считается «явным». – Mat
Вы найдете релевантные сообщения путем поиска «[C++] контекстно конвертированного bool» (без кавычек) – Mat
Каковы контексты, которые считаются «явными», где я могу найти некоторую информацию об этом? – user2321876