J'ai perdu de nombreuses heures à localiser un problème avec gcc. J'ai voulu tester notre base de code avec un autre compilateur de regarder pour plus de mises en garde que Clang peut-être manqué. J'ai été choqué de voir que pratiquement la moitié de la projet arrêté pour compiler en raison de l'échec de l'argument de modèle de déduction. J'ai essayé ici de muets mon cas, jusqu'à la plus simple morceau de code.
#include <type_traits>
struct Foo
{ };
// This is a template function declaration, where second template argument declared without a default
template <typename T, typename>
void foo(const Foo & foo, T t);
// This is a template function definition; second template argument now has a default declared
template <typename T, typename = typename std::enable_if<1>::type>
void foo(const Foo & foo, T t)
{
}
int main(int argc, char ** argv)
{
foo(Foo{}, 1);
return 0;
}
Ignorer un 1
dans la std::enable_if<1>
. Évidemment, c'est une valeur constante, simplement pour ne pas compliquer les choses quand il n'a pas d'importance.
Ce morceau de code compile[1] avec clang (3.4 à 4.0), cpi (16, 17), Visual C++ (19.00.23506). Fondamentalement, je ne pouvais pas trouver n'importe quel autre c++11 compilateur qui, à l'exception de gcc (de 4,8 à travers 7.1), ne compile pas ce morceau de code.
La question est de savoir qui a raison et qui a tort ici? Ne gcc se comportent conformément à la norme?
Évidemment, ce n'est pas un problème critique. Je peux facilement passer d' std::enable_if
à la déclaration. La seule victime serait l'esthétique. Mais il est agréable d'être en mesure de cacher un vilain 100 caractères std::enable_if
morceau de code, qui n'est pas immédiatement pertinents pour l'utilisateur de la fonction de la bibliothèque, dans la mise en œuvre.
Live exemple sur godbolt.org.