[英]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.