je suis tombé sur l'exemple suivant confusion impliquant ADL et les fonctions supprimées:Fonction supprimée et ADL
Premier exemple:
namespace A
{
struct S{};
void f(S){cout << "adl" << endl;}
}
namespace C
{
//void f() = delete;
//void f (double);
void test()
{
A::S arg;
f(arg);
}
}
int main()
{
C::test();
return 0;
}
Comme prévu, A::f
est appelé par ADL. Dans l'exemple suivant, il y a une fonction supprimée avec le même nom dans C
:
namespace A
{
struct S{};
void f(S){cout << "adl" << endl;}
}
namespace C
{
void f() = delete;
//void f (double);
void testi()
{
A::S arg;
f(arg);
}
}
int main()
{
C::testi();
return 0;
}
échoue avec Compiling le message d'erreur error: use of deleted function 'void C::f()'
. Apparemment, les fonctions supprimées empêchent la version ADL d'entrer dans la table de surcharge. Maintenant, pour le dernier exemple: En plus de la fonction supprimée il y a maintenant une autre, non supprimé, la fonction du même nom:
namespace A
{
struct S{};
void f(S){cout << "adl" << endl;}
}
namespace C
{
void f() = delete;
void f (double);
void testi()
{
A::S arg;
f(arg);
}
}
int main()
{
C::testi();
return 0;
}
L'exécution de cette exécute la version ADL de f
. Donc, en conclusion:
- sans fonction correspondant aux résultats d'espaces de noms en cours dans la version ADL appelés
- Ayant juste la fonction supprimée dans les résultats de l'espace de nommage dans une erreur, probablement parce que la version ADL n'a pas été découverte à
- Une autre fonction, non supprimée, dans l'espace de noms actuel entraîne l'appel de la version ADL.
Mes questions: Ce comportement est-il voulu? Si oui, quelle partie de la norme spécifie cela? Edit: J'ai oublié de mentionner que j'ai utilisé onlinegdb pour la compilation, donc gcc/g ++ a été utilisé.
Je viens de réaliser que g ++ C++ 14 5.4.1 a été utilisé dans mon exemple – LcdDrm
@LcdDrm - Vous pouvez utiliser [Wandbox] (https://wandbox.org/) et faites une recherche binaire par version de GCC pour savoir exactement quand elle a été corrigée, si vous le souhaitez :) – StoryTeller
GCC 6.3 échoue, GCC 7.1 fonctionne.Le compilateur MS Visual Studio fonctionne également – LcdDrm