내가 이해하지 못하는 행동이 있습니다. 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;
}
: 여기
코드인가?!?
표준 iostream 손실. 포인터 값을 받아들이는 변환기가 필요하지 않습니다. 그 중 하나가 더 싸기 때문에 잃게됩니다. –
@HansPassant - 당신의 의견은'char' 대'wchar_t'의 동작이 왜 다른지 설명하지 않습니다. –