Почему неявное преобразование не работает с широким потоком?

У меня есть поведение, которое я не понимаю. Я наблюдал это на VS2005, но Выходы IDEONE (с использованием GCC 4.7.2) в основном то же самое.

Вот код:

#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;
}

Вот вывод:

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

Что тут происходит?!?

2

Решение

Есть частичная специализация для basic_ostream

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

который хорошо подходит для cout << UserString() дело.

Нет ничего похожего на wchar_t а также WUserString(), так что функция-член

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

будет лучшим соответствием для этого (как в большинстве «необычных» случаев).

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]