Почему operator<< неявно преобразует объект моего класса custome в строку

#c #class #templates #type-conversion #operator-overloading

#c #класс #шаблоны #преобразование типа #перегрузка оператора

Вопрос:

У меня есть класс, в котором реализована общедоступная string функция преобразования memeber. В сочетании с operator<<(iostream amp;, 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
}

  

Комментарии:

1. operator<< взятие std::string (или, если быть точным, std::basic_string ) является шаблоном. Неявные преобразования не учитываются при выводе параметров шаблона.

Ответ №1:

operator<< For std::string — это шаблон, и неявное преобразование не будет учитываться при выводе аргумента шаблона, что приводит к сбою.

Вывод типа не учитывает неявные преобразования (кроме настроек типа, перечисленных выше): это работа для разрешения перегрузки, которая произойдет позже.

Как вы показали, вы можете преобразовать A в std::string явно или написать operator<< для A .