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