簡體   English   中英

為什么 ostream iomanip 在傳遞給 operator&lt; 時不需要模板參數<!--?</div--><div id="text_translate"><p> 在 gnu stdc++ header ostream 的命名空間 std 中,這是 std::endl 的定義:</p><pre> template&lt;typename _CharT, typename _Traits&gt; inline basic_ostream&lt;_CharT, _Traits&gt;&amp; endl(basic_ostream&lt;_CharT, _Traits&gt;&amp; __os) { return flush(__os.put(__os.widen('\n'))); }</pre><p> 為什么可以寫std::cout &lt;&lt; std::endl; 在沒有模板參數的情況下使用endl ?</p></div>

[英]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 將被推導出為charstd::char_traits<char>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM