SFINAE 回傳類型與模板參數的行為差異
在C 中,替換失敗不是錯誤(SFINAE) 習慣用法允許有條件基於模板元編程和類型特徵的函數重載。但是,在某些情況下,SFINAE 的行為會有所不同,具體取決於其在函數模板聲明中的位置。
考慮以下程式碼:
template<typename T, typename = typename std::enable_if< std::is_integral<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T, typename = typename std::enable_if< std::is_floating_point<T>::value>::type> void foo(T); // Incorrect placement, triggers error template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_integral<T>::value>::type; template<typename T> void foo(T) // Correct placement -> typename std::enable_if< std::is_floating_point<T>::value>::type;
在第一組重載(不正確的位置)中,將 SFINAE 放在模板參數中而不是返回類型中會導致編譯錯誤。這是因為在確定重載等效性時不考慮預設模板參數(在本例中為 ::type 後綴)。因此,編譯器將函數視為具有相同簽章的重複聲明。
但是,在第二組重載(正確放置)中,SFINAE 應用於返回類型,這涉及模板元編程。這種放置確保引用模板參數的表達式是函數簽名的一部分。因此,編譯器將重載識別為不同的實體,從而使 SFINAE 能夠正常運作。
以上是C 函數重載中的傳回類型和模板參數之間的 SFINAE 行為有何不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!