为什么operator <<不会隐式将我的定制类对象转换为字符串

问题描述

我有一个实现了公共string转换成员函数的类。与operator<<(iostream &,xxx)结合使用时,我希望我的类将自动(隐式)转换为string,因此适合参数类型。

但是,事实并非如此。为什么,我不想编写operation<<函数

#include <string>
#include <iostream>

using namespace std;

struct A {
    operator string() { return "asd"; }
};

int main() {
    cout << A() << endl;  // error
    cout << string(A()) << endl; // ok
}

解决方法

operator<< for std::string是模板,template argument deduction中将不考虑隐式转换,否则将失败。

类型推导不考虑隐式转换(上面列出的类型调整除外):这是overload resolution的工作,以后会发生。

如所示,您可以将A显式转换为std::string,或为operator<<编写A