Я думаю, что вы ищете: [basi c .link] / 9 :
Два одинаковых имени ([basi c. pre]) и которые объявлены в разных областях, должны обозначать одну и ту же переменную, функцию, тип, шаблон или пространство имен, если
- оба имени имеют внешнюю связь или связь с модулем и объявлены в объявлениях, прикрепленных к одному и тому же модулю. или оба имени имеют внутреннюю связь и объявляются в одной и той же единице перевода; и
- оба имени относятся к членам одного пространства имен или к членам, не наследуемым, одного и того же класса; и
- , когда оба имени обозначают функции или шаблоны функций, подписи ([defns.signature], [defns.signature.templ]) совпадают.
Если несколько объявлений одно и то же имя с внешней связью будет объявлять одну и ту же сущность, за исключением того, что они присоединены к разным модулям, программа некорректна Диагностика c не требуется. [Примечание: объявления using, объявления typedef и объявления псевдонимов не объявляют сущности, а просто вводят синонимы. Аналогично, директивы using не объявляют сущности. - примечание конца]
И [basi c .link] / 11 :
После всех настроек типов (во время которых используются typedefs) заменены их определениями), типы, указанные во всех объявлениях, ссылающихся на данную переменную или функцию, должны быть идентичными, за исключением того, что объявления для объекта массива могут указывать типы массивов, которые отличаются наличием или отсутствием привязки основного массива ([dcl. массив]). Нарушение этого правила для идентификации типа не требует функции диагностики c.
И [defns.signature] :
. ⟩ Имя, список параметров-типов ([dcl.fct]) и окружающее пространство имен (если есть)
Тип возвращаемого значения не является частью подписи, поэтому вы нарушаете правило та же самая подпись означает ту же самую сущность.
Вообще говоря, все обсуждения объема и поиска имени в стандарте довольно прерваны, пока работа Херринга Дэвиса "Герой, которого мы не заслуживаем" завершена.