Не перегружаемые определения не встроенных функций в разных единицах перевода - PullRequest
4 голосов
/ 25 февраля 2020

Допустим, у меня есть 2 TU с двумя определениями не встроенных функций с внешними связями, которые отличаются только типами возвращаемых данных.
Какой параграф (ы) нарушает моя программа?
[basi c .def.odr] / 4 говорит:

Каждая программа должна содержать ровно одно определение каждой не встроенной функции или переменной, которая используется в этой программе с помощью odr, вне оператора отбрасывания; Диагностика не требуется c требуется.

Но

  1. В этом параграфе говорится "используется odr" , что может иметь или не иметь место .
  2. Как мне в конце концов определить, определяю ли я одну и ту же не встроенную функцию в разных TU? [over.dcl] / 1 говорит о том же объеме.

1 Ответ

7 голосов
/ 25 февраля 2020

Я думаю, что вы ищете: [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]) и окружающее пространство имен (если есть)

Тип возвращаемого значения не является частью подписи, поэтому вы нарушаете правило та же самая подпись означает ту же самую сущность.

Вообще говоря, все обсуждения объема и поиска имени в стандарте довольно прерваны, пока работа Херринга Дэвиса "Герой, которого мы не заслуживаем" завершена.

...