为什么隐式转换为std :: string不适用于operator <<被调用

时间:2019-02-10 13:07:35

标签: c++ type-conversion implicit-conversion

首先,我使用用户定义的转换函数将对象隐式转换为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;
}

为什么在第二种情况下不会发生隐式转换。

1 个答案:

答案 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)是一个非模板函数;它没有这样的问题。