2

我有一些我不理解的行为。我在 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

这里发生了什么?!?

4

1 回答 1

3

basic_ostream 有部分专业化

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

这非常适合这种cout << UserString()情况。

和没有类似的东西wchar_tWUserString()所以成员函数

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

将是最好的匹配(如在大多数“不寻常”的情况下)。

于 2013-07-05T19:09:01.333 回答