c++ c++17 sfinae

c++ - ¿Por qué void_t no funciona en SFINAE pero enable_if no funciona?



c++17 (1)

Esto parece estar relacionado con el problema CWG # 1980 (créditos a T.C. por corregirme) .

Como solución puede definir void_t como:

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

(de cppreference)

ejemplo vivo en wandbox

Estaba tratando de entender cómo funciona SFINAE y estaba experimentando con este código

#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>(); }

El código comentado funciona pero el primero no . El compilador me da errores diciendo que hay una redefinición y que la deducción del argumento de la plantilla falló. ¿Podría alguien explicar por qué sucede esto? Los dos void_t s deben ser independientes ¿verdad? Dado que una línea verifica x y la otra para y . ¿Cómo puedo arreglarlo?