Je dispose d'un système très simple ( C++11 ) dont le dernier code clang ( version 3.4 trunk 187493 ) ne compile pas, mais GCC compile bien.
Le code (ci-dessous) instancie la fonction-template foo
avec le type de fonction-local Bar
et tente ensuite d'utiliser son adresse comme un paramètre de modèle non-type pour le modèle de classe Func
:
template<void(*FUNC_PTR)(void)>
struct Func {};
template<typename T> extern inline
void foo() {
using Foo = Func<foo<T>>;
}
int main() {
struct Bar {}; // function-local type
foo<Bar>();
return 0;
}
clang émet l'erreur suivante :
erreur L'argument de modèle non-type fait référence à la fonction 'foo' qui n'a pas de lien
Cependant, si je déplace le type Bar
à la portée globale (en le sortant de la fonction), alors clang le compile bien, ce qui prouve que le problème vient du fait que le type est fonction-locale .
Alors, est-ce que clang a raison d'émettre cette erreur, ou est-ce que le standard ne le supporte pas (dans ce cas, GCC est trop indulgent en le permettant) ?
EDIT #1 : Pour être clair, il s'agit pas un duplicata de cette question depuis le Impossible d'utiliser des types locaux comme paramètres de modèles a été supprimée dans C++11. Cependant Il n'est toujours pas clair s'il y a des implications de liaison impliquées dans l'utilisation d'un type local, et si clang est correct ou non en émettant cette erreur.
EDIT #2 : Il a été déterminé que clang avait raison d'émettre l'erreur pour le code ci-dessus (voir la réponse de @jxh), mais qu'il ne l'a pas fait. incorrectement émet également une erreur pour le code suivant (avec using
la déclaration est passée de foo<Bar>()
la portée de main()
) :
template<void(*FUNC_PTR)(void)>
struct Func {};
template<typename T> extern inline
void foo() {}
int main() {
struct Bar {};
using F = Func<foo<Bar>>;
return 0;
}