簡體   English   中英

SFINAE是否依賴於類型扣除?

[英]Does SFINAE depend on type deduction?

我對cppreference.com中的以下引用感到困惑:

此規則適用於函數模板的重載解析期間:當替換推導類型的模板參數失敗時,將從重載集中丟棄特化而不是導致編譯錯誤。

這是否意味着SFINAE無法在沒有類型扣除的情況下工作? 例如,請考慮以下代碼:

template <typename T> std::true_type has_value_type_helper(typename T::value_type*);
template <typename> std::false_type has_value_type_helper(...);

template <typename T> inline constexpr bool has_value_type_v
   = decltype(has_value_type_helper<T>(nullptr))::value;

int main() {
   std::cout << has_value_type_v<int> << std::endl;
   std::cout << has_value_type_v<std::vector<int>> << std::endl;
}

它按預期工作,但據我所知,沒有類型扣除。 模板參數在has_value_type_helper<T>(nullptr)明確提供。 甚至SFINAE可以用這種方式嗎?

甚至SFINAE可以用這種方式嗎?

是。

替換是扣除過程的一部分 明確提供模板參數並不能消除替換的需要( [temp.deduct] / 2 ) - 而且它是替換(SFINAE中的S)失敗並非錯誤( [temp.deduct] / 8 )。

在這種情況下,當您向has_value_type_helper顯式提供T時,我們仍然需要將T替換為參數T::value_type 這是在替換的直接上下文中,因此如果該替換失敗 - 對於類似int類型而言,它沒有名為value_type的嵌套類型別名 - 它是......而不是錯誤,我們只是從考慮中移除候選者。 我們有另一個備用候選者,所以這很好。

這里沒有“真實”類型推斷,因為您直接指定了類型。 但是sfinae仍然在這里工作,因為編譯器推斷出在實例化模板時需要使用它。

暫無
暫無

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

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