[c++] C ++ 11에서 안전한 부울 관용구가 더 이상 사용되지 않습니까?

이 답변은 @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 살 짜리가 아님)로 도약하는 것은 아닙니다 . 심지어 많은 양의 코더가 있었더라도 코드의 역 호환성을 유지하는 능력은 필수입니다. 이러한 관용구는 프로그램에 적합한 것보다 라이브러리에 더 합리적이라고 생각합니다.


답변