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


179

이 답변은 @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)

제목에서 우리의 가정이 맞습니까? 잠재적 인 단점을 간과하지 않기를 바랍니다.


30
+1 : 나는 앞으로 나올 표준에 대한 새로운 것을 가르쳐주는 이런 유형의 질문을 좋아합니다.
Björn Pollex

1
표준에서 암시 적 명시 적 캐스트가 누락 된 것을 알고 operator bool있습니다. 예를 들어, shared_ptrp라는 멤버가 있고이 메소드를 가지고 operator bool() const { return p; }있으면 컴파일 할 수 없습니다. 어리석은 IMO입니다.
David

@David "암시 적 명시 적"캐스트는 무엇을 의미합니까?
Sz.

답변:


128

예. 이것은 암시 적 사용자 정의 변환 만있는 문제에 대한 예이며이 문제로 인해 명시적인 사용자 정의 변환 연산자가 실제로 고안 되었으며 모든 안전한 부울 항목을 훨씬 더 깨끗하고 논리적 인 것으로 대체했습니다.


-5

나는 그것을 쓸모없는 것으로 부르지 않을 것이다. 모든 사람이 아직 C ++ 11 ( 1 살 짜리가 아님)로 도약하는 것은 아닙니다 . 심지어 많은 양의 코더가 있었더라도 코드의 역 호환성을 유지하는 능력은 필수입니다. 이러한 관용구는 프로그램에 적합한 것보다 라이브러리에 더 합리적이라고 생각합니다.


34
C ++ 11이있는 곳에서 순전히 이야기하고있었습니다. 이 질문은 오래된 코드, 이전 버전과의 호환성 또는 C ++ 11 인식 컴파일러로 변경하려는 의사를 느끼지 않습니다. 또한 C ++ 11 자체는 완전히 이전 버전과 호환되지 않으며 주요 변경 사항이 도입되었습니다.
Xeo

4
그것을 알 수 없었을 것입니다. 죄송합니다. 처음에 링크 된 답변뿐만 아니라 질문에 [c ++] 및 [c ++-faq] 태그가 붙어 있다는 사실을 고려하지 않았으므로 언어 의 단계에 대한 평가 가 적절 하다고 생각하게 되었습니다.
Luis Machuca

1
당신은 확실히 옳습니다. 나는 분명히 질문에 명시하지 않았습니다. 머리를 숙여 주셔서 감사합니다.
Xeo

1
이 답변은 실제로 업데이트가 거의 2 년이되었으므로 업데이트를 사용할 수 있습니다.
강아지

1
나는 당신에게 직접 맥주를 사서 "어려운 감정 없음"이라고 말하지만, 불일치로 인해 공감해야 할 것입니다. 그러나 C ++ 11의 많은 패러다임 --std=c++0x은 최종 손톱이 표준 관으로 옮겨지기 오래 전부터 배치되고 있었으며 ISO 사양에 이름을 붙이기로 결정했습니다. 당신이 정말로 깊은 템플릿 메타 프로그래밍 중독자가 아니라면, C ++ 11 스펙의 세부 사항과 사람들이 사용하는 것에 대한 결과는 당신에게 아무런 영향을 미치지 않을 것입니다. 그리고 지금, 내 시계로, 그것은 거의 2015 년입니다.
HostileFork는 SE가
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.