J'ai la classe suivante :
template <typename T=void>
class Foo{
public:
Foo(){};
template <typename = typename std::enable_if_t<!std::is_void<T>::value, std::nullptr_t>>
Foo(const T&){};
};
int main() {
Foo<void> v;
}
v
est créé à l'aide du premier constructeur. Par conséquent, il n'est pas nécessaire de créer le second constructeur pour le module Foo<void>
.
Pourquoi est-il créé de toute façon ?
Le problème est que la création explicite du second constructeur avec le type void
contourne SFINAE, et essaie de faire un paramètre de const void&
. Cela n'est évidemment pas autorisé.
Comment puis-je empêcher le deuxième constructeur d'être valide si T
es void
?