将std :: endl传递给std :: operator <<

All*_*nzi 2 c++ std

在这个Stack Overflow回答中, 它表示与之std::cout << "Hello World!" << std::endl;相同

std::operator<<(std::operator<<(std::cout, "Hello World!"), std::endl);
Run Code Online (Sandbox Code Playgroud)

但是当我编译上面的代码行时,它不会编译!然后尝试别的东西后,我发现,它不会编译的原因是因为std::endl,如果我取代std::endl的"\n",然后它工作.但为什么你不能传递std::endl给std::operator<<?

或者更简单,是不是std::cout<<std::endl;一样std::operator<<(std::cout, std::endl);?

编辑

编译时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提供更长的错误消息.

luk*_*k32 5

这是因为答案有点不对劲.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;
}
Run Code Online (Sandbox Code Playgroud)

实例.

好吧,有些人会说流库没有标准中最漂亮的设计.