在模板中输入basic_ostream

Input basic_ostream in the template

为什么不使用ttt::focus_pocus()而没有使用()?规则是什么,为什么它在这里起作用?

#include <iostream>

namespace ttt
{
  template<class CharT, class Traits>
  std::basic_ostream<CharT, Traits>& focus_pocus(std::basic_ostream<CharT, Traits> &os)
  {
    return os << "focus pocus";
  }
};

int main() 
{
  std::cout << ttt::focus_pocus << std::endl; <--- here
}

DEMO

<< 运算符被重载以接受与示例 [1] 中的 focus_pocus 函数具有相同签名的函数。这就是为什么您不调用该函数并且不需要 () 括号的原因。

存在此重载,以允许输出对象,例如std::endl 操作输出流,例如在写入换行符后将其刷新。在您的特殊情况下,您也可以编写一个返回字符串的函数。

[1]: https://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt