передать 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 дает гораздо более длинное сообщение об ошибке.

540   2  

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 вопроса и ответы в некоторой степени связаны с вашим вопросом и могут помочь вам найти решение

Оператор

Имеет ли std:: cout возвращаемое значение?

Comments

    Ничего не найдено.