2010-11-28 4 views
8

대답 할 때 this question 나는 정말로 나를 혼란스럽게하는 연구를했다.연산자 우선 순위 (void * before bool?)

성공적으로 열린 ifstream 두 개가 동일하지는 않지만 두 개의 ifstream이 실패한 것으로 나타났습니다. 처음에는 cplusplus.com을 확인했습니다. operator !은 badbit 및 failbit의 상태를 반환합니다. 나는 이것의 반대가 여전히이 두 비트의 상태를 되 돌리는 것이지만, 뒤집힌 것이라고 생각한다. 잘못된

  • , 두 개의 성공적인 호출이 동일하지 않기 때문에.

그런 다음 나는 뭔가를 반환 할 operator bool 어딘가에 있다고 생각했습니다. 그래서 ifstream에서 되돌아 가려고 시도하고 istream::operator bool()을 발견했습니다. 이는 _Ok을 반환합니다.

  • 아직도 잘못 그러나
    이 전혀 호출하지 않는 것 (두 성공적인 호출은 여전히 ​​동일하지 않기 때문에, 수 없습니다).

그래서 접근 방식을 변경하고 Visual Studio에서 디스 어셈블리를 확인했습니다. 그리고 나는 무엇을 발견합니까?
if (file0 != file1) {operator bool(), 이 아니고 operator void*() (또는 실제로는 __imp_std::ios_base::operator void *)이라고합니다.

그래서

  • 어떤 operator bool()가 포인터 값으로 캐스팅하기 전에 호출 발견 안 나는이 가지고있는 질문 ..?
  • 다소 operator bool() 내가 놓친 것은 operator void*입니까?
  • 이해가 안되는 부분이 최적화되어 있습니까?

  • 아니면 실제로 void*이 비교 bool보다 더 나은 일치 생각하는 C++ 에서 완전히 잘못입니까?

답변

2

1). 여러 번 반복되지만 다른 반환 유형을 사용할 수는 없습니다. 2.) 예, operator!은 badbit/failbit을 반환하지만 operator!은 사용중인 operator!=과 완전히 다른 무언가입니다.

+0

아, 그렇습니다. 알겠습니다. 고마워, 나는 여기에 피곤해진다. 나는 이것에 대한 후속 질문을 가지고있다. 어쩌면 당신은 [이 하나] (http://stackoverflow.com/q/4294873/238902 "void void *와 operator bool을 둘 다 정의 할 수있다)라고 대답 할 수있다. – Default

+0

그러나 ifstream은 실제로 operator! =가 아닌 void * 연산자를 호출합니다. – Default