Почему «статические» функции в разных TU не нарушают ODR? - PullRequest
3 голосов
/ 09 мая 2019

ODR позволяет нам несколько раз определять одну и ту же встроенную функцию (с некоторыми ограничениями).

Однако как насчет более простого случая static функций?

// First TU
static int foo() { return 0; }
int bar1() { return foo(); }

// Second TU
static int foo() { return 1; }
int bar2() { return foo(); }

Если мы быстро прочитаем [basic.def.odr] p4, мы можем наивно заключить, что это будет UB:

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

Где в стандарте C ++ указано, что каждый foo является отдельной функцией и поэтому не нарушает ODR, даже если они имеют одинаковые имена?

Это просто вопрос чтения [basic.link] p2.2 (т. Е. Из-за внутренней связи имена не относятся к одной и той же сущности, и поэтому [basic.def.odr] p4 здесь не применяется)? Или есть еще нюансы / правила, связанные с этим определением (например, что-то в [basic.scope])?

Обратите внимание, что с безымянными пространствами имен результат очевиден, поскольку имя будет уже другим / уникальным.

1 Ответ

5 голосов
/ 09 мая 2019

Правильно - даже если они имеют одно и то же имя локально, это две разные функции / сущности, поэтому нарушения нет.

[basic.link]/4.3: Когда имя имеет внутренняя связь , на обозначаемую ею сущность можно ссылаться по именам из других областей в той же единице перевода.

[basic.link]/5: Имя, имеющее область пространства имен, имеет внутреннюю связьесли это имя переменной, шаблон переменной, функции или шаблон функции, который явно объявлен static;или [..]

Я не могу сразу найти какую-либо дальнейшую формулировку (нормативную или иную), которая применима, но я не думаю, что она нам нужна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...