이 답변은 @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
)
제목에서 우리의 가정이 맞습니까? 잠재적 인 단점을 간과하지 않기를 바랍니다.
답변
예. 이것은 암시 적 사용자 정의 변환 만있는 문제에 대한 예이며이 문제로 인해 명시적인 사용자 정의 변환 연산자가 실제로 고안 되었으며 모든 안전한 부울 항목을 훨씬 더 깨끗하고 논리적 인 것으로 대체했습니다.
답변
나는 그것을 쓸모없는 것으로 부르지 않을 것이다. 모든 사람이 아직 C ++ 11 ( 1 살 짜리가 아님)로 도약하는 것은 아닙니다 . 심지어 많은 양의 코더가 있었더라도 코드의 역 호환성을 유지하는 능력은 필수입니다. 이러한 관용구는 프로그램에 적합한 것보다 라이브러리에 더 합리적이라고 생각합니다.