如果它是一个函数,std :: endl如何不使用任何括号?

Zee*_*bit 23 c++ std visual-studio-2010

问题几乎在标题中.根据C++ Reference,std::endl实际上是一个函数.看看它的声明<iostream>,这可以得到验证.

但是,当您使用时std::endl,您不使用std::endl().相反,你使用:

std::cout << "Foo" << std::endl;
Run Code Online (Sandbox Code Playgroud)

实际上,如果您使用std::endl(),编译器需要更多参数,如上面的链接所示.

有人会解释这个吗?有什么特别之处std::endl?我们可以在调用时实现不需要任何括号的函数吗?

CB *_*ley 30

std::endl 是声明的函数模板(27.7.3.8):

template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
Run Code Online (Sandbox Code Playgroud)

您可以"流式传输"的原因std::coutbasic_ostream类模板具有声明的成员:

basic_ostream<charT,traits>& operator<<
    ( basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&) );
Run Code Online (Sandbox Code Playgroud)

被定义为具有返回的效果pf(*this)(27.7.3.6.3).

std::endl没有括号是指一组重载函数 - 函数模板的所有可能的特化,但在一个特定类型的函数指针可接受的上下文中使用(即作为参数operator<<),可以明确地推导出正确的特化.