2008-11-04 3 views
6

Boost 라이브러리의 문서를 여러 번 읽었을 때 "convertible to bool"이라고 표시된 반환 값을 실행했습니다 ("bool로 변환"이라는 문구가있는 페이지를 검색하면 약 3 분의 1 수준입니다). 나는 그 이유를 설명하는 종이에 대한 간접적 인 언급을 한 번 우연히 발견했지만 결코 그 종이를 찾을 수 없었다. (그리고 나는 더 이상 내가 그 참조를 보았던 페이지를 찾을 수 없다).부스트 라이브러리가`bool`을 반환하는 것보다는`bool`으로 변환 할 수있는 이유는 무엇입니까?

누군가 bool을 단순히 반환하는 대신 "bool으로 변환 가능"한 것을 반환해야하는 이유와 이유를 설명 할 수 있습니까?

답변

25

"부울로 변환 가능"은 부울 문맥에서 의미있게 사용할 수있는 모든 것을 의미합니다 (예 : if 조건). 이는 암시 적 변환에서 의미가 있습니다. 부울 컨텍스트에서 사용하려는 객체를 상상해보십시오. std::fstream : 여기

ifstream ifs("filename"); 
while (ifs >> token) 
    cout "token " << token << " read." << endl; 

, ifs는 불리언으로 전환된다. 음, 실제로는 그렇지 않습니다. 오히려, 그것은 무언가로 변환 될 수 있고, 차례로 bool으로 변환 될 수 있습니다. 여기에는 문을 방지하는 것입니다 :

int b = ifs; 

추론은 명령문이 대부분의 아마 것은 아니다 컴파일러 따라서이를 방지해야한다는 것입니다. bool 대신 "bool로 변환"을 반환하면 한 표현식에서 두 개의 사용자 정의 암시 적 변환을 연결할 수 없으므로 이렇게됩니다.

이 문맥에서는 safe bool idiom을 찾아 볼 수 있습니다. Chris는 이미 반환 유형으로 void*을 사용하여 가능한 구현을 암시했습니다. 일반적으로 포인터 은 true을 나타내는 데 사용됩니다. 이것은 STL에서 사용하는 것입니다. 그러나 이것은 불행히도 여전히 결함이 있습니다. 몇 가지 대안이 제안되었습니다 (위에서 링크 된 기사에서 깔끔하게 정리되었습니다). 그리고 내가 아는 한, 고려 대상으로 C++ 0x에도 포함되었습니다. 그러나 나는이 제안의 현재 상태를 알지 못한다.

+0

그건 제가 찾을 수 없었던 기사입니다. 감사! –

+1

현재 상태는 명시 적 변환 연산자이며 안전 bool 관용구를 불필요하게 만듭니다. –

+0

@Sebastian, 맞습니까? "if (f)"가 명시 적 연산자 bool()을 호출하거나 "if (bool (f))"가 필요합니까? 표준이 bool 인 경우 매개 변수를 정의하는 것과 같지 않고 단순히 bool로 변환 할 수 없습니다. – jmucchiello

0

아마도 성능을 위해? C/C++에서는 숫자에 대해 if 문을 수행 할 수 있습니다 (0은 거짓이고 다른 것은 참입니다). 엄격한 bool로 변환하는 것은 많은 경우에 필요하지 않은 추가 작업입니다.

나는 실제로 부스트를 사용하지 않았다. 그래서 그것은 단지 추측이지만 그것은 나에게 합리적인 것 같다.

11

boolint으로 승격 가능하며 산술 연산에 참여할 수 있습니다. 진실 테스트를 위해 값을 사용해야하는 경우가 종종 있습니다.

컨버터블 -bool은 보통 void*과 같으며 null 포인터는 false이며 다른 것은 참이지만 산술 연산에는 사용할 수 없습니다.