이 답변은 @R입니다. Martinho Fernandes 는 안전한 부울 관용구가 C ++ 11에서 적절하게 사용되지 않는다는 것을 보여줍니다.
explicit operator bool() const;
답변의 표준 인용에 따르면 §4 [conv] p3
:
일부 임시 변수 (§8.5)에 대해
T
선언T t=e;
이 올바르게 구성된 경우에만 표현식 e를 암시 적으로 유형으로 변환 할 수 있습니다t
. 특정 언어 구성에서는 표현식을 부울 값으로 변환해야합니다. 하는 식e
이러한 맥락에서 나타나는는 것으로 알려져 문맥 전환 을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
)
제목에서 우리의 가정이 맞습니까? 잠재적 인 단점을 간과하지 않기를 바랍니다.
operator bool
있습니다. 예를 들어, shared_ptr
p라는 멤버가 있고이 메소드를 가지고 operator bool() const { return p; }
있으면 컴파일 할 수 없습니다. 어리석은 IMO입니다.