Дело в том, что директива using не добавляет членов в текущее пространство имен, поэтому члены std::
все еще могут быть скрыты объявлениями в этом пространстве имен.
Вместо этого
using std::isnan
будет вести себя так, как если бы члены импортированного пространства имен были добавлены в пространство имен, включающее как use
-положение, так и импортированное пространство имен. Объявление using является обычным объявлением в пространстве имен, поэтому может участвовать в разрешении перегрузки с помощью следующих объявлений.
Однако, как указано в комментариях, это приведет к ошибке, если функция не существует. Чтобы обойти это, вам нужно убрать его из вашего detail::
пространства имен, затем . Это должно работать, потому что импортированное определение будет на том же уровне, что и перегрузка dummy
. Вы можете перегрузить глобальное пространство имен или создать вспомогательное пространство имен (в глобальном пространстве имен) и импортировать оба .