передать std:: endl оператору std:: <
В этом ответе на переполнение стека
он говорит, что std::cout << "Hello World!" << std::endl; то же самое, что
std::operator<<(std::operator<<(std::cout, "Hello World!"), std::endl);
Но когда я компилирую приведенный выше код строки, он не компилируется! Затем, попробовав что-то еще, я обнаружил, что причина, по которой он не компилируется, заключается в std::endl, Если я заменяю std::endl на "n", то он работает. Но почему вы не можете перейти от std::endl к std::operator<<?
Или, проще говоря, разве std::cout<<std::endl; не то же самое, что std::operator<<(std::cout, std::endl);?
EDIT
При компиляции с помощью icpc test.cpp выводится сообщение об ошибке:
error: no instance of overloaded function "std::operator<<" matches the argument list argument types are: (std::ostream, <unknown-type>) std::operator<<(std::cout, std::endl);
И g++ test.cpp дает гораздо более длинное сообщение об ошибке.
2 ответов:
Это потому, что ответ там немного неправильный.
std::endlявляется функцией манипулятора, для них нет перегрузки в определениях автономныхoperator<<изostream. Это функция-членbasic_ostream .Другими словами, представленная ссылка-это неправильно. Он должен быть одним из следующих:
#include <iostream> int main() { std::endl(std::operator<<(std::cout, "Hello World!")); std::operator<<(std::cout, "Hello World!").operator<<(std::endl); //of course if you pass new line as a supported type it works std::operator<<(std::operator<<(std::cout, "Hello World!"), '\n'); std::operator<<(std::operator<<(std::cout, "Hello World!"), "\n"); std::operator<<(std::operator<<(std::cout, "Hello World!"), string("\n")); return 0; }Ну, некоторые люди говорят, что потоковая библиотека не имеет самого красивого дизайна в стандарте.
Я не знаю об этой теме, но я думаю, что эти 2 вопроса и ответы в некоторой степени связаны с вашим вопросом и могут помочь вам найти решение
Comments