2016-09-20 7 views
3

다음 코드를 고려하십시오.C++ 11에서 std :: function이 암시 적으로 bool로 변환되지 않는 이유는 무엇입니까?

#include <functional> 

int main(void) 
{ 
    std::function<void()> f1; 
    if (f1) { /* ok */ 
     ... 
    } 

    bool b = f1; /* compile-error */ 
    bool B = !f1; /* ok */ 
    ... 
} 

std::function<>는 어떤 상황에 있지만 그들 모두에 bool로 암시 적으로 변환합니다. bool-variable에 할당하는 것은 작동하지 않지만 작업 결과 또는 if()- 구문의 사용 결과는 OK입니다.

왜 그렇습니까? 우리는 불리언 연산을 수행해야만 변환이 작동합니다.

내가 작업 한 내용은 b = f1- 라인이며 이중 쾅 : !!입니다. 그런 현대 C++ 코드에서 골동품처럼 보입니다.

편집이뿐만 아니라 컴파일 : std::function::operator boolexplicit 변환 기능입니다

bool b = f1 || f1; /* OK */ 
+2

연산자 bool이 명시 적으로 표시되어 있기 때문입니다. http://en.cppreference.com/w/cpp/utility/functional/function/operator_bool –

+0

@wasthishelpful 동일한 대답이지만 동일한 질문은 아닙니다. IMHO –

+0

우리의 대답이 더 좋습니다. –

답변

7

참고, 암시 적 변환은 허용되지 않습니다. 따라서 bool b = f1;은 작동하지 않습니다. (당신이 bool b = static_cast<bool>(f1); 같은 static_cast을 사용하는 경우 명시 적 변환은 잘 작동합니다.)

OK 인 if() -statement에서 사용.

적용 할 if, operator! 또는 operator||, contextual conversions 함께 사용되고, 상기 명시적인 변환 기능이 고려 될

.

(C++ 이후 11) 다음과 같은 다섯 가지 상황에서

는 타입 bool 예상되고 선언 bool t(e);이 잘 형성된 경우 암시 적 변환 시퀀스가 ​​내장되어있다. 즉, 명시 적 사용자 정의 변환 함수 (예 : explicit T::operator bool() const;)가 고려됩니다. 이러한 표현식 e는 으로 바꿔 말하면이라고합니다.

  • if의 발현 while, for를 제어하는 ​​단계;
  • 논리 연산자 !, &&||;
  • 조건부 연산자 ?:;
  • static_assert;
  • noexcept.
+1

명시 적 요청이 있어도 암시 적, 명시 적 및 문맥 적 암시 적 변환이 있습니다. 알아 둘만한. –

+0

@ PatrickB. '! '때문에'bool '변환은'명시 적으로 '선언 되었더라도 암시 적으로 적용됩니다. –