gpt4 book ai didi

c++ - 为什么隐式转换不适用于宽 ostream?

转载 作者:搜寻专家 更新时间:2023-10-31 01:48:39 24 4
gpt4 key购买 nike

我有一些我不理解的行为。我在 VS2005 上观察到了这一点,但是 IDEONE (using GCC 4.7.2) outputs基本相同。

代码如下:

#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

这是怎么回事?!?

最佳答案

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);

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

关于c++ - 为什么隐式转换不适用于宽 ostream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17486156/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com