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

2023-12-25

我试图理解如何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_ts 应该是独立的吧?由于一行检查x另一个用于y。我该如何修复?


这似乎与CWG 问题 #1980 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1980 (归功于T.C. https://stackoverflow.com/users/2756719/t-c纠正我).

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

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

(来自 cppreference) http://en.cppreference.com/w/cpp/types/void_t

wandbox 上的实例 https://wandbox.org/permlink/iiNGJAqXnq35HlJP

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 void_t 在 SFINAE 中不起作用,但 enable_if 可以 的相关文章

随机推荐