[英]Why does an ostream iomanip not need template parameters when passed to operator<<?
在 gnu stdc++ header ostream 的命名空間 std 中,這是 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<<
將操縱器作為 function 指針。 模板參數推導在傳遞模板時執行std::endl
,因此模板 arguments 不需要顯式指定。
如果可能,編譯器將從 function arguments 中推斷出缺少的模板 arguments。 當嘗試調用 function 並且獲取 function 模板的地址時,會發生這種情況。
這種機制使得使用模板運算符成為可能,因為除了將其重寫為 function 調用表達式之外,沒有語法可以為運算符指定模板 arguments。
#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
的模板 arguments 將被推導出為char
和std::char_traits<char>
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.