2012-07-28 1 views
0
bool image_manager::contains_image(const std::string& filename) 
{ 
    return this->map_.count(filename); 
} 

지금 내가 얻을 경고는 다음과 같습니다 std::map의 개수의 반환 형식은() 메소드는 MSVC에서이 경고가 나타나는 이유는 무엇입니까?

warning C4800: 'unsigned int' : forcing value to bool 'true' or 'false' (performance warning) 

입니다

그러나 이후 :

1 개에 해당하는 키를 가진 요소 인 경우, 찾았거나 그렇지 않으면 0입니다.

따라서 부울처럼 사용할 수 있습니다. 그러면 왜 내가 정확히이 경고를 받게됩니까? C++에서 정수는 기본적으로 부울 검사에 사용할 수 있습니다. 그러므로 0 == false1 == true. 그렇다면 왜 컴파일러가 경고를 던지나요? 나는 또한이 같은 static_cast 사용하여 시도 :

return static_cast<bool>(this->map_.count(filename)); 

을하지만, 난 여전히 경고를 받고 있어요.

+1

지금은 _why_가 아니지만 체크 ('return map_.count (filename)! = 0;')로 경고를 제거 할 수 있습니다. –

+0

나는 그들의 bool이 int만큼 잘 수행되지 않는다고 생각한다. – chris

+0

@ chris하지만 '부울'은 단지 enum이나'typedef'ed int라고 생각했습니다. 'enum bool (false = 0, true = 1);과 같은 것; – ApprenticeHacker

답변

2

일반적으로 unsigned intbool이 아니므로주의해야합니다. 시도해보십시오.

return this->map_.count(filename) > 0; 

대신에.

+1

-1은 여전히 ​​bool 측면에서 참이어야합니다. 0이 아닌 것은 모두 참입니다. – chris

+1

@chris 일반적으로는 사실이지만 특정 애플리케이션에 따라 다릅니다. 여기에 분명히'> 0'이면 충분합니다 ... – Simon

+0

@chris 명시 적 변환에 대해 경고하는 것이 이상합니다. 부호없는 int는'-1'이 될 수없고'map :: count'는 어쨌든 0이나 1 만 반환 할 수 있습니다. – Potatoswatter

0
size_type count (const key_type& x) const; 

산술 범위가 지정되지 않은 열거 포인터 또는 부재 형 포인터의 prvalue가 불리언 타입의 prvalue로 전환시킬 수있다. 0 값인 null 포인터 값 또는 null 멤버 포인터 값이 false로 변환됩니다. 다른 값은 true로 변환됩니다. 예 : std :: nullptr_t의 prvalue는 bool 유형의 prvalue로 변환 할 수 있습니다. 결과 값은 false입니다.

표준 프로그램은 올바른 형식이며 표준을 지원하는 모든 컴파일러에서 작동해야합니다.

+1

경고 메시지를 표시해도 문제가 없습니다. 경고를 오류로 처리하면 모든 컴파일러가 비 규격이됩니다. – Potatoswatter

+0

@Potatoswatter가 수정되었습니다. – ForEveR

+0

이상한 수정. 그가 말하고자하는 것은 표준이 컴파일러에게 어떤 종류의 경고를 내 보내면 안되는지에 대해 강요하지 않는다는 것입니다. –