Sie klären in einem Kommentar:
Ich versuche, die richtigen, um herauszufinden, SFINAE-Beschwörung, um zu überprüfen, ob eine freie Funktion eines bestimmten Namens existiert.
Sie können nicht.
Wenn Sie sagen eine freie Funktionfoo
existiert, genannt, was meinst du damit?
Es hat eine der sein:
der Compiler eine Erklärung vonfoo
gesehen hat:
... int foo(int i);
oder:
der Compiler eine Definition vonfoo
gesehen hat:
... int foo(int i) {
...
return ...;
}
Eine Definition ist auch eine Erklärung, so dass, wenn der Compiler nicht eine Erklärung von foo
gesehen hat, dann hat es keine Definition entweder gesehen.
Angenommen, Sie zu SFINAE-Sonde sind versuchen, ob foo
deklariert wird. Wenn der Compiler, dass nicht einmal verwendet Sie eine Erklärung von foo
dann jeder nachfolgenden Code schreiben gesehen hat foo
als Name einen Compiler-Fehler in der Vene provozieren:
error: use of undeclared identifier 'foo'
Sie Code schreiben können, nicht zu SFINAE-Probe, ob foo
deklariert ist, weil Sie nicht C++ schreiben können, die nicht deklarierte Namen verwendet, Punkt.
Angenommen, Sie versuchen, SFINAE-Probe, ob foo
ist definiert. , das zu tun, würden Sie zuerst Erklärung von foo haben müssen - entweder , die Sie selbst oder eine geschrieben haben, die Sie von einer Header-Datei haben.
Aber natürlich, da eine Erklärung von foo
kann der Compiler nicht sagen, ob oder nicht definiert ist, und kümmert sich nicht darum, außer in den besonderen Fällen, dass die Funktion als static
deklariert wird oder inline
oder in einem anonymen Namespace. Sonst lässt es das Finden oder Nichtfinden einer Definition zum Linker.
Im Allgemeinen ist dann SFINAE-Prüfung der Existenz der Funktion Definitionen ist ebenfalls ein Non-Starter. Und selbst wenn foo
ist static
oder inline
oder in einem anonymen Namespace deklariert, und es fehlt eine Definition innerhalb der Übersetzungseinheit, jeden Code, foo
in Übereinstimmung mit der Erklärung verwendet bleibt wohlgeformter Code; Selbst in diesen Fällen bleibt die SFINAE-Prüfung für "is-it-defined" bedeutungslos.
"Ich würde gerne prüfen, ob zwei verschiedene Symbole sich auf dasselbe beziehen, auch wenn es keins gibt." Das macht wenig Sinn. –
@NeilButterworth Ja, ich weiß, ich bin mir nicht sicher, wie ich es verbalisieren soll. Ich denke, eine bessere Art zu sagen ist: "Ich würde gerne prüfen, ob ein vollständig qualifizierter Name und ein unqualifizierter oder teilweise qualifizierter Name auf dasselbe Symbol verweisen." –
Wenn ein Symbol nicht definiert ist und Sie versuchen, es zu verwenden, Sie erhalten einen Compiler-Fehler, schlicht und einfach. – AndyG