C++ 为什么';t隐式转换是否适用于宽ostream?

C++ 为什么';t隐式转换是否适用于宽ostream?,c++,operator-overloading,iostream,overload-resolution,C++,Operator Overloading,Iostream,Overload Resolution,我有一些行为我不明白。我在VS2005上观察到了这一点,但基本相同 代码如下: #include <iostream> #include <string> struct UserString { const char* p; operator const char*() const { std::cout << "! " << __FUNCTION__ << std::endl;

我有一些行为我不明白。我在VS2005上观察到了这一点,但基本相同

代码如下:

#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;
}
#包括
#包括
结构用户字符串{
常量字符*p;
运算符常量char*()常量{

std::cout基本团队有部分专业化

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

将是这方面的最佳匹配(在大多数“不寻常”的情况下).

标准的iostream lossage。它不需要您的转换器来接受指针值。您的失败是因为该值更便宜。@HansPassant-您的评论没有解释为什么
char
wchar\u t
的行为不同。谢谢。这就解释了。您是否知道或有一个指针来解释为什么会出现这种局部异常“不寻常”是一个很好的委婉说法;-)…嗯,
操作符我想这只是历史,但我没有真正的证据。对于
char
char*
(甚至是
有符号字符和
无符号字符)还有一些其他的专门化这可能被认为是一些优化的机会。
template<class _TraitsT>
basic_ostream<char, _TraitsT>&
   operator<<(basic_ostream<char, _TraitsT>& _Stream, const char* _String);
basic_ostream& operator<<(const void* _Address);