Por que produzir uma classe com um operador de conversão não funciona para std :: string?

Isso funciona, imprimindo 1:

#include <iostream>

struct Int {
    int i;
    operator int() const noexcept {return i;}
};

int main() {
    Int i;
    i.i = 1;
    std::cout << i;
}

Contudo,isso não consegue compilar no GCC 4.8.1:

#include <iostream>
#include <string>

struct String {
    std::string s;
    operator std::string() const {return s;}
};

int main() {
    String s;
    s.s = "hi";
    std::cout << s;
}

Aqui estão as partes relevantes do erro:

erro: nenhuma correspondência para "operador <<" (os tipos de operandos são "std :: ostream {aka std :: basic_ostream}" e "String")
std :: cout << s;

recorte

template std :: basic_ostream <_CharT, _Traits> & std :: operator << (std :: basic_ostream <_CharT, _Traits> e, const std :: basic_string <_CharT, _Traits, _Alloc> &)
operador << (basic_ostream <_CharT, _Traits> & __os,

/usr/include/c++/4.8/bits/basic_string.h:2753:5: nota: dedução / substituição do argumento do modelo falhou:
main.cpp: 25: 18: note: "String" não é derivada de "const std :: basic_string <_CharT, _Traits, _Alloc>"
std :: cout << s;

Eu só usostd::cout estd::string, que possuem os mesmos argumentos de modelo. Eu realmente não tenho certeza porque isso não seria capaz de pegar a conversão implícita como ele fez paraInt. Por que funciona comint, mas nãostd::string?

questionAnswers(2)

yourAnswerToTheQuestion