C++의 ostream
클래스는 operator<<
에 대한 많은 기본 오버로드를 제공하지만 모두 동일한 방식으로 정의되지는 않습니다.정적 대 멤버 연산자 오버로드 : std :: operator << 및 std :: ostream :: operator <<
namespace std {
ostream &operator<<(ostream &os, char c);
}
산술 유형 streambuf
및 스트림 매니퓰레이터에 대한 overloads 있지만 부재로서 정의된다
overloadschar
위한 유형 string
유형과 r- 수치 스트림은 같은 자유 namespace
-scope 함수로 정의
namespace std {
ostream &ostream::operator<<(int val);
}
내 질문
: 같은std::ostream
의 기능
이 구별의 이유가 있습니까? 이 연산자 오버로드에 대한 호출이 약간 다르게 작동합니다 (즉, 무료 namespace
- 범위 정의에 대한 ADL). 최적화를 위해 특정 유형의 연산자 과부하가 선호 될 수 있다고 생각합니다. 그러나 여기 std::ostream
은 다른 유형에 대해 두 유형의 정의를 모두 사용합니다. 이것이 의미하는이 구현 또는 구현 최적화에 이점이 있습니까?
"이러한 멤버와 달리 자유 함수 오버로드는 ostream에서 파생되는 클래스의 경우에도 항상 과부하 해결에 참여합니다. 그러나 ADL의보다 구체적인 범위에서 일치하는 다른 무료 함수를 사용하여 자유 함수를 숨길 수는 없습니다. –
또한 'ostream'에서 파생 된 클래스의'ostream '에 대한 암시 적 변환이 자유 함수를 해결할 때 모호함을 만들 수 있는지에 대해 명확하지 않습니다. 죄송합니다! –
@definecindyconst - 숨기지 않습니다. 단지 그들을 오버로드합니다. 회원은 [정말로 숨겨져 있지만] (https://ideone.com/d7XLZh). – StoryTeller