簡體   English   中英

為什么 void_t 在 SFINAE 中不起作用但 enable_if 可以

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

(來自 cppreference)

魔杖盒上的現場示例

暫無
暫無

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

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