首先,我使用用户定义的转换函数将对象隐式转换为int
,然后使用cout
运算符将其插入<<
。该程序已成功编译并打印为“ 0”。
#include <iostream>
using namespace std;
class T {
public:
operator int () {
return 0;
}
};
int main()
{
T a;
cout << a << endl;
return 0;
}
然后,我尝试执行相同的操作,只是将对象转换为std::string
。该程序出现编译错误。
#include <iostream>
#include <string>
using namespace std;
class T {
public:
operator string () {
return "";
}
};
int main()
{
T a;
cout << a << endl;
return 0;
}
为什么在第二种情况下不会发生隐式转换。
答案 0 :(得分:7)
为什么在第二种情况下不会发生隐式转换。
因为operator<<(std::basic_string)
是模板函数,
template <class CharT, class Traits, class Allocator> std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& os, const std::basic_string<CharT, Traits, Allocator>& str);
这意味着在给定T a; cout << a << endl;
的情况下,要推导所有三个模板参数。但是在template argument deduction中,将不考虑隐式转换,然后推导失败。
类型推导不考虑隐式转换(上面列出的类型调整除外):这是超载解析的工作,稍后会发生。
另一方面,std::basic_ostream::operator<<(int)
是一个非模板函数;它没有这样的问题。