为什么void_t在SFINAE中不起作用,但enable_if起作用

Why void_t doesnt work in SFINAE but enable_if does

本文关键字:enable if 起作用 不起作用 void SFINAE 为什么      更新时间:2023-10-16

我试图了解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 有关(感谢 T.C. 纠正我(。

作为解决方法,您可以将void_t定义为:

template<typename... Ts> struct make_void { typedef void type;};
template<typename... Ts> using void_t = typename make_void<Ts...>::type;

(来自CPP首选项(

魔杖盒上的现场示例