在命名空间 std 中,gnu stdc++ 头文件 ostream 中,这是 std::endl 的定义。
template<typename _CharT, typename _Traits>
inline basic_ostream<_CharT, _Traits>&
endl(basic_ostream<_CharT, _Traits>& __os)
{ return flush(__os.put(__os.widen('\n'))); }
为什么可以写 std::cout << std::endl;
哪儿 endl
是在没有模板参数的情况下使用的?
std::basic_ostream<CharT,Traits>::operator<<
以操纵器作为函数指针。模板参数推导 当被传递给模板时,如 std::endl
因此模板参数不需要显式指定。
在可能的情况下,编译器会从函数参数中推断出缺少的模板参数。这发生在尝试调用函数和获取函数模板地址的时候。
这种机制使得使用模板操作符成为可能,因为除了将操作符重新写成函数调用表达式之外,没有任何语法可以为其指定模板参数。
#include <iostream> int main() { std::cout << "Hello, world" << std::endl; // operator<< is looked up via ADL as std::operator<<, // then deduced to operator<<<char, std::char_traits<char>> both times // std::endl is deduced to &std::endl<char, std::char_traits<char>> }
给定 std::cout << std::endl;
,参数类型为相应的 operator<<
是 std::basic_ostream<char,std::char_traits<char>>& (*func)(std::basic_ostream<char,std::char_traits<char>>&)
的模板参数,那么 std::endl
将被推断为 char
和 std::char_traits<char>
.