首頁 >後端開發 >C++ >C 函數重載中的傳回類型和模板參數之間的 SFINAE 行為有何不同?

C 函數重載中的傳回類型和模板參數之間的 SFINAE 行為有何不同?

Linda Hamilton
Linda Hamilton原創
2024-12-27 04:43:51636瀏覽

How Does SFINAE Behavior Differ Between Return Types and Template Parameters in C   Function Overloads?

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn