2013-07-05 2 views
2

내가 이해하지 못하는 행동이 있습니다. VS2005에서 이것을 관찰했지만, IDEONE (using GCC 4.7.2) outputs은 기본적으로 동일합니다.암시 적 변환이 왜 wide ostream에서 작동하지 않습니까?

String Literal 
std::string 
! operator const char* **** "works" 
UserString    **** 
! operator const char* 
UserString 
WString Literal 
std::wstring 
! operator const wchar_t* **** "doesn't" - op<<(void*) is used 
0x80491b0     **** 
! operator const wchar_t* 
WUserString 

여기 무슨 일이야 다음은 출력의

#include <iostream> 
#include <string> 

struct UserString { 
    const char* p; 
     operator const char*() const { 
       std::cout << "! " << __FUNCTION__ << std::endl; 
       return p; 
     } 

     UserString() 
     : p ("UserString") 
     { } 
}; 

struct WUserString { 
     const wchar_t* p; 
     operator const wchar_t*() const { 
       std::cout << "! " << __FUNCTION__ << std::endl; 
       return p; 
     } 

     WUserString() 
     : p (L"WUserString") 
     { } 
}; 


int main() { 
     using namespace std; 
     cout << "String Literal" << endl; 
     cout << string("std::string") << endl; 
     cout << UserString() << endl; 
     cout << static_cast<const char*>(UserString()) << endl; 

     wcout << L"WString Literal" << endl; 
     wcout << wstring(L"std::wstring") << endl; 
     wcout << WUserString() << endl; 
     wcout << static_cast<const wchar_t*>(WUserString()) << endl; 

     return 0; 
} 

: 여기

코드인가?!?

+0

표준 iostream 손실. 포인터 값을 받아들이는 변환기가 필요하지 않습니다. 그 중 하나가 더 싸기 때문에 잃게됩니다. –

+0

@HansPassant - 당신의 의견은'char' 대'wchar_t'의 동작이 왜 다른지 설명하지 않습니다. –

답변

3

cout << UserString() 경우에 적합하다 basic_ostream

template<class _TraitsT> 
basic_ostream<char, _TraitsT>& 
    operator<<(basic_ostream<char, _TraitsT>& _Stream, const char* _String); 

에 대한 부분 특수화 있습니다.

wchar_tWUserString() 유사한 아무것도 때문에 (대부분의 "특별한"경우 등)

basic_ostream& operator<<(const void* _Address); 

가에 가장 적합한 될 멤버 함수가 없습니다.

+0

감사합니다. 그것은 그것을 설명합니다. 'char *'에 대해 부분적인 전문화가 존재하는 이유를 알고 있거나 그에 대한 포인터를 가지고 있습니까? 여기의 비대칭 성은 약간 짜증납니다. –

+0

"이상한"은 완곡 어법입니다 ;-) ... IMHO,'operator << (const void * _Address);'는 기능보다 버그입니다. 나는 그것을 사용한 모든 사례에 대해 그것이 런타임에 나를 물린 20 가지 경우가 있다고 생각합니다. –

+1

그것은 단지 추측이지만, 나는 진짜 증거가 없다. 아마도''char''와''char *'(그리고''signed char'와''unsigned char')에 대해서도 몇몇 최적화가있을 가능성이 있다고 여겨지는 다른 전문화가 있습니다. –

관련 문제