C++ 为什么';t隐式转换是否适用于宽ostream?
我有一些行为我不明白。我在VS2005上观察到了这一点,但基本相同 代码如下: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;
#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);