如何理解 C++11 添加的 plus<void> 特化版?

VS2015版,STL裡面的 累加函數 accumulate(accumulate(_InIt _First, _InIt _Last, _Ty _Val)); 中,再次調用4個參數的版本,並且函數對象是 內置的 plus&();跟進去發現,這是個特化版本,並且語法生硬。。讀不懂的程度

這一塊代碼要如何理解呢?這個特化版有什麼存在意義?跟泛化版的Plus&看似沒有區別,兩者功能上都是一樣的,對兩個值進行相加。

泛化版本:operator()(左操作數,右操作數) return 左操作數+右操作數;


OT: 請認準 plus().

[Wandbox]三へ( へ?? ?)へ ????


首先 std::plus& 是在C++14中才加入的,C++11還沒有。

簡單地說,std::plus& 中的 operator () 本身是一個模板成員函數 (T, U),可以接受任意合法的參數,而普通的版本的參數類型為 (const T, const T)。這樣做的好處有:

  1. 兼容任意合法類型。
  2. 可以直接用 std::plus&<&> 而不需要寫出完整的類型(std::plus&<&> == std::plus&)。
  3. 利用完美轉發提高效率。


就是void版本的東西的operator()是接受不加任何限制的T類型的函數模板,然後實際上調用哪個+,全靠ADL


用戶可能為自己定義的類型UT特化std::plus&,特化的版本可能和+運算符的效果完全不一樣,而標準要求的是使用+運算符,所以如果MSVC STL這裡用plus&就錯了。

otoh,特化standard library class的member function template是UB,所以可以用plus&


推薦閱讀:

再開一個討論區,C++11的std::function和template function的比較?
為什麼Visual Studio系列產品基本不做防盜版?
用vc++編寫窗口程序,控制多軸運動。類似於實現PLC串口通信之類的。應該學習那方面的知識,怎麼快速入手呢?
Windows 7 和 Windows XP 哪個對 VC6.0 的支持好?
為什麼VS對C++11 C++14的特性支持的那麼慢?

TAG:C | VisualC | CPrimer | C11 | STL源碼剖析書籍 |