Вы пояснить в комментарии:
Я пытаюсь выяснить, правильно SFINAE для этого, чтобы проверить, существует ли свободная функция данного имени.
Вы не можете.
Когда вы говорите свободная функция называетсяfoo
существует, что вы имеете в виду?
Это должен быть один из:
Компилятор видел декларациюfoo
:
... int foo(int i);
или:
Компилятор видел определениеfoo
:
... int foo(int i) {
...
return ...;
}
Определение также является объявлением, поэтому, если компилятор не видел объявление foo
, то он также не видел определения.
Предположим, вы пытаетесь использовать SFINAE-зонд, объявлен ли foo
. Если компилятор даже не видел декларация foo
затем любой последующий код вы пишете, что использует foo
как имя будет вызывать ошибку компиляции в вене:
error: use of undeclared identifier 'foo'
Вы не можете написать код для SFINAE-зонда объявляется foo
, потому что вы не можете писать C++, который использует необъявленные имена, период.
Предположим, вы пытаетесь использовать SFINAE-зонд, является ли foo
. Чтобы сделать это, сначала нужно иметь объявление из foo - либо тот, который вы написали, или тот, который у вас есть в каком-то заголовочном файле.
Но, конечно же, учитывая заявление о foo
, компилятор не может сказать, является ли или нет определяется и не заботится, за исключением особых случаев, что функция объявлена как static
или inline
или в анонимном пространстве имен. В противном случае это оставляет или не находит определение для компоновщика.
Вообще-то, SFINAE-зондирование существования функции определения также a non-starter. И даже если foo
объявлен static
или inline
или в анонимном пространстве имен, и отсутствует определение в пределах единицы компиляции, любой кода, который использует foo
в соответствии с его декларацией остается хорошо сформированный кодом; поэтому даже в тех случаях, когда SFINAE-зондирование для is-it-defined остается бессмысленным.
«Я хотел бы проверить, чтобы проверить, относятся ли два разных символа к одному и тому же, даже если их не существует». Это не имеет большого смысла. –
@NeilButterworth Да, я знаю, я не уверен, как это сделать. Я предполагаю, что лучше сказать, что «я хотел бы проверить, относится ли полное имя и неквалифицированное или частично квалифицированное имя к одному и тому же символу» –
Если символ не определен и вы пытаетесь его использовать, вы получите ошибку компилятора, просто и просто. – AndyG