Нет.Я нахожусь в дороге, и у меня нет стандарта, чтобы цитировать меня, но sfinae занимает места на этапе компиляции, где компилятор проверяет, существует ли имя вообще, и на более позднем этапе имеет место контроль доступа.
Это похоже на разрешение перегрузки, когда учитываются все имена, и частное совпадение лучше, но не компилируется, хотя есть другое совпадение, которое будет "хорошо", но не приватным.
Добавление:
Основная проблема 1170 гласит:
1170 Проверка доступа во время вывода аргумента шаблона
Раздел: 14.8.2 [temp.deduct]
Статус: FDIS. Отправитель: Adamczyk. Дата: 2010-08-03
[Голосование в РГ на совещании в марте 2011 года.]
Согласно 14.8.2 [temp.deduct] параграф 8,
Проверка доступа не является частью процесса замены.Следовательно, когда дедукция завершается успешно, ошибка доступа все еще может возникнуть, когда создается экземпляр функции.
Это имитирует способ проверки доступа в разрешении перегрузки.Однако опыт показывает, что это исключение ошибок доступа из-за сбоя вывода существенно усложняет Стандартную библиотеку, поэтому это правило следует изменить.
Предлагаемое решение (январь 2011 г.):
Изменение 14.8.2 [temp.deduct] параграф 8 следующим образом:
Если подстановка приводит к недопустимому типу или выражению, вывод типа не выполняется.Недопустимый тип или выражение - это то, что было бы неправильно сформировано, если было бы написано с использованием замещенных аргументов.[Примечание: проверка доступа не выполняется как часть процесса замены.- примечание конца] Следовательно, когда вычет успешен, ошибка доступа все еще могла бы произойти, когда функция создается.Только недопустимые типы ...
Итак, моя интерпретация состоит в том, что это невозможно в C ++ 03, но C ++ 11 сделал это возможным.