Подтвердить что ты не робот

Почему оператор ввода - это адрес печати вместо строки?

У меня есть простые строки кода, где я использую оператор ввода <<, чтобы показать hello world string. Если я использую оператор b, то это должно привести к a.operator(b); Я пытаюсь сделать то же самое с оператором вставки, а на выходе я получил адрес строки, а не фактическую строку.

std::cout<<"Hello world"<<std::endl;
std::cout.operator<<("Hello world").operator<<(std::endl);

Вывод:

Привет мир
0120CC74

Я использую Visual Studio.

Есть ли у меня проблемы с преобразованием оператора?

4b9b3361

Ответ 1

std::cout<<"Hello world"<<std::endl;

использовать перегруженный оператор вывода для const char*, то есть свободную функцию, а не функцию-член.

std::cout.operator<<("Hello world").operator<<(std::endl);

использовать перегруженный оператор вывода для const void*, так как const char* неявно конвертируется в const void*.

Здесь вы можете посмотреть перегрузки участников здесь и бесплатные перегрузки

Ответ 2

Моя ставка заключается в том, что оператор-функция-член для std::ostream(char*) не перегружен.

Если вы посмотрите на ostream:: operator < <, void* наилучшее совпадение и char*, естественно, преобразуется в него, в то время как глобальный operator < (std:: basic_ostream) имеет точные перегрузки для типов char*, которые получают.

Конечно, они ведут себя по-другому.

Ответ 3

Как говорят другие ответы, проблема в том, что вы явно вызываете функцию-член operator <<, которая не перегружена для const char*.

Чтобы получить перегрузку const char*, вам нужно вызвать бесплатную функцию operator <<, которая должным образом перегружена:

operator<<(std::cout, "Hello World").operator<<(std::endl);

Аналогично, нет никакой свободной функции перегрузки operator << для записи std::ostream& (*)(std::ostream&), поэтому для std::endl вам нужно использовать функцию-член.

Из этого можно видеть, что вы не можете переписать из синтаксиса оператора infix (std::cout << ...) функцию синтаксиса вызова (operator << (...)) без потери общности.