首頁 > 後端開發 > C++ > 為什麼 SFINAE 回傳類型失敗但模板參數成功?

為什麼 SFINAE 回傳類型失敗但模板參數成功?

Mary-Kate Olsen
發布: 2024-12-13 07:27:10
原創
984 人瀏覽過

Why Does SFINAE Fail in Return Types but Succeed with Template Parameters?

返回類型與模板參數中的SFINAE

假設我們有一個區分整數和浮點數的函數模板foo:

template<typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type>
auto foo(T) -> void;

template<typename T, typename = typename std::enable_if<std::is_floating_point<T>::value>::type>
auto foo(T) -> void;
登入後複製

但是,當使用double呼叫時,此程式碼會失敗並出現錯誤value:

foo(3.4);
// Error: no matching function for call to 'foo(double)'
登入後複製

為什麼這種方法會失敗?

在這種情況下,SFINAE 用於有條件地定義 foo 的回傳類型。但是,這違反了函數模板重載的規則,該規則不考慮預設模板參數。因此,編譯器將兩個 foo 模板視為具有相同簽名的相同函數。

使用表達式引用模板參數的替代方法

要解決此問題,我們可以改為在返回類型中使用引用模板參數的表達式:

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_integral<T>::value>::type;

template<typename T>
auto foo(T) -> typename std::enable_if<std::is_floating_point<T>::value>::type;
登入後複製

透過此修改,表達式std::enable_if 成為函式簽名,允許SFINAE 區分兩個foo 範本。

因此,第二個版本的 foo 可以正常工作,而第一個版本會觸發錯誤。

以上是為什麼 SFINAE 回傳類型失敗但模板參數成功?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板