Почему этот код не может скомпилироваться?
#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++.
template <CharT, ...> operator<<(basic_ostream<CharT...>&, const basic_string<CharT...>&)
перегрузка, которая, как вы надеетесь, будет вызвана, но для этого требуется вывод параметров шаблона, а указанный вывод не принимает во внимание пользовательские преобразования. В результате эта перегрузка не считается жизнеспособной, и никакая другая перегрузка не работает. - person Igor Tandetnik   schedule 28.06.2016std::cout << (std::string)f << "\n";
- person mvidelgauz   schedule 28.06.2016