How does std::endl not use any brackets if it is a function?

后端 未结 3 1660
星月不相逢
星月不相逢 2020-12-14 08:21

The question is pretty much in the title. According to C++ Reference, std::endl is actually a function. Looking at its declaration in

相关标签:
3条回答
  • 2020-12-14 08:26

    std::endl is a function template declared (27.7.3.8):

    template <class charT, class traits>
    basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
    

    The reason that you can "stream" it to std::cout is that the basic_ostream class template has a member declared:

    basic_ostream<charT,traits>& operator<<
        ( basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&) );
    

    which is defined to have the effect of returning pf(*this) (27.7.3.6.3).

    std::endl without parentheses refers to a set of overload functions - all possible specializations of the function template, but used in a context where a function pointer of one particular type is acceptable (i.e. as an argument to operator<<), the correct specialization can be unambiguously deduced.

    0 讨论(0)
  • 2020-12-14 08:36

    std::endl is an object of some type (not really important) that is supplied as an argument to operator<<( std::ostream &, decltype(std::endl)).

    EDIT

    Reading the other question would lead me to think that endl is a function template and that we most likely select the ostream& operator<<(ostream&(*)(ostream&)) member function overload.

    0 讨论(0)
  • 2020-12-14 08:44

    Though it's a function [template], standard stream manipulators are designed to be sent to streams as function pointers (or functor object references). Inserting the result of a function call won't give you anything but the value that results from that function call.

    This means that you stream the functor itself (f), rather than the result of calling it (f()).

    0 讨论(0)
提交回复
热议问题