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])?
Обратите внимание, что с безымянными пространствами имен результат очевиден, поскольку имя будет уже другим / уникальным.