оператор std::string: почему объект не может выводиться?

Почему этот код не может скомпилироваться?

#include <string>
#include <iostream>

struct Foo
{
    operator std::string () const
    {
        return std::string("Hello world !");
    }
};

int main(void)
{
    Foo f;

    std::cout << f << "\n";
}

в то время как этот делает:

#include <string>
#include <iostream>

int main(void)
{
    std::cout << std::string("Hello world !") << "\n";
}

и этот тоже:

#include <string>
#include <iostream>

struct Bar
{
    operator int ()
    {
        return 42;
    }
};

int main(void)
{
    Bar b;

    std::cout << b << "\n";
}

Я думал, что это то же самое, из-за operator std::string, но g++ не компилирует ни clang++.


person Boiethios    schedule 28.06.2016    source источник
comment
Существует template <CharT, ...> operator<<(basic_ostream<CharT...>&, const basic_string<CharT...>&) перегрузка, которая, как вы надеетесь, будет вызвана, но для этого требуется вывод параметров шаблона, а указанный вывод не принимает во внимание пользовательские преобразования. В результате эта перегрузка не считается жизнеспособной, и никакая другая перегрузка не работает.   -  person Igor Tandetnik    schedule 28.06.2016
comment
@IgorTandetnik Пожалуйста, добавьте это как ответ   -  person Boiethios    schedule 28.06.2016
comment
Почему возможно, что я ищу минуты на сайте и не могу найти вопрос, который все же был задан?   -  person Boiethios    schedule 28.06.2016
comment
вам нужно выполнить явное приведение std::cout << (std::string)f << "\n";   -  person mvidelgauz    schedule 28.06.2016
comment
Вы можете добавить в Foo: std::string operator()() { return Hello World 2 !; }. Затем в main используйте std::cout ‹‹ foo() ‹‹ \n; Но мне нравится актерский состав Мвидельгауза.   -  person 2785528    schedule 28.06.2016