![](/img/trans.png)
[英]Why does enable_if<>* = nullptr work when enable_if<> = void doesn't?
[英]Why void_t doesnt work in SFINAE but enable_if does
我試圖了解SFINAE
工作原理,並且正在嘗試使用此代碼
#include <type_traits>
struct One {
using x = int;
};
struct Two {
using y = int;
};
template <typename T, std::void_t<typename T::x>* = nullptr>
void func() {}
template <typename T, std::void_t<typename T::y>* = nullptr>
void func() {}
/*template <typename T, std::enable_if_t<std::is_same_v<typename T::x, typename T::x>>* = nullptr>
void func() {}
template <typename T, std::enable_if_t<std::is_same_v<typename T::y, typename T::y>>* = nullptr>
void func() {} */
int main() {
func<One>();
func<Two>();
}
注釋的代碼有效,但第一個無效。 編譯器給我錯誤說有一個重新定義和模板參數推導失敗。 有人可以解釋為什么會發生這種情況嗎? 兩個void_t
應該是獨立的吧? 因為一行檢查x
,另一行檢查y
。 我該如何解決?
這似乎與CWG 問題 #1980 (感謝TC糾正我)有關。
作為一種解決方法,您可以將void_t
定義為:
template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.