Le problème dont ils vous avertissent est qu'en C++14, cela fonctionnera :
void call(void (*f)())
{
f();
}
void func() noexcept {}
int main(int argc, char* argv[])
{
call(&func);
return 0;
}
mais en C++17, il faudrait changer la déclaration de call
pour être :
void call(void (*f)() noexcept)
{
f();
}
Puisque vous avez défini call
pour être un modèle, vous n'avez pas besoin de vous inquiéter à ce sujet. Néanmoins, cela pourrait vous poser des problèmes parce que le type inféré change, ce qui n'arrive généralement pas.
Par exemple, ce code sera compilé en C++14 mais pas en C++17 :
void foo() noexcept {}
void bar() {}
template <typename F>
void call(bool b, F f1, F f2)
{
if (b)
f1();
else
f2();
}
void foobar(bool b)
{
call(b, &foo, &bar);
}
En C++14, les types de foo
y bar
sont les mêmes, mais ils sont différents en C++17, ce qui signifie que la résolution des modèles échouera. Le message d'erreur dans gcc 7.2 avec le drapeau -std=c++1z
est :
note: template argument deduction/substitution failed:
note: deduced conflicting types for parameter 'F' ('void (*)() noexcept' and 'void (*)()')
Dans l'exemple que vous avez donné, il n'y a aucun problème et vous n'aurez aucun problème à compiler en mode C++14 ou C++17. Si le code est plus complexe que l'exemple donné ici (par exemple, similaire aux exemples que j'ai donnés plus haut), vous pourriez rencontrer des problèmes de compilation. Il semble que vous ayez un compilateur récent ; essayez de compiler avec -std=c++1z
et voyez s'il y a des avertissements ou des erreurs.
2 votes
Si
call
est entièrement interne à votre projet, cela n'a pas d'importance. Il n'a d'importance que dans les cas où deux unités de traduction différentes l'utilisent, où l'une a été compilée avec C++17 et l'autre non. Même dans ce cas, puisquecall
est une fonction modèle, elle n'aura probablement pas un grand impact autre que celui d'avoir une définition supplémentaire dans l'exécutable final.2 votes
@DanielH Je ne veux pas parler pour Barry, ci-dessus, mais si vous compilez un projet avec -wError, alors cet "avertissement inoffensif" fera que le programme ne compilera pas du tout, même s'il est correct. C'est important.
1 votes
@markt1964 Dans le poste seulement
-Wall
est utilisé. Si vous compilez avec-Werror
ou essayez d'éviter les erreurs de compilation (ce qui est une bonne idée), alors oui, vous aurez un problème. Un problème qui pourrait, peut-être, être mieux résolu en ajoutant-Wno-noexcept-type
selon les circonstances.0 votes
@Barry, est-ce que vous reconstruisez votre projet à partir de zéro (et tous ses utilisateurs) lorsque vous changez de version de compilateur ?
2 votes
Juste une note, mais il pourrait y avoir moins de cet avertissement dans le GCC8. Je ne suis pas sûr que cela s'applique à votre cas spécifique.